任务要求
- 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
1 参考《GMT 0009-2012 SM2密码算法使用规范》第6节“数据转换” 在附件中的utils.h和utils.c中完成位串与8位字节串的转换功能(10'):
int Bitstr2ByteArr(unsigned char * bs, unsigned char * ba,int *lba);
int ByteArr2Bitstr(unsigned char * ba, unsigned char * bs, int *lbs);
2 并写出测试代码测试上述函数(不能与下面代码一样),比如(10'):
unsigned char bs [] = "1010010100011100";
int len;
Bitstr2ByteArr(bs, char * ba, &len);
//结果:ba = “051C”; len=2
char ba[] = "051C";
ByteArr2Bitstr(char * ba, char * bs);
//结果:bs= "1010010100011100"
3 提交代码(或代码链接)和运行结果
代码
main.c
`#include <stdio.h>
include <string.h>
include "utils.h"
int main(){
int bitList[8] = { 0 };
int a;
sscanf("25C1", "%x", &a);
int b,n;
n=Bitstr2ByteArr(bitList,b);
printf("ba=");
printf("%x ",n);
printf("len=4\n");
ByteArr2Bitstr(a, bitList);
printf("bs=");
for (int i =0 ;i<8;++i)
printf("%i",bitList[i]);
printf("\n");
}
`
utils.c
`#include <stdio.h>
include <string.h>
include "utils.h"
int ByteArr2Bitstr(int ba,int * bs){
for (int i =0 ;i<8;++i)
{
int nTmp = (1 << i);
bs[7-i] = (( ba & nTmp) == nTmp )? 1 : 0;
}
}
int Bitstr2ByteArr(int * bs,int ba)
{
int n = 0;
for (int i = 0 ; i < 8;++i)
{
n += bs[7-i] * (1 << i);
}
*bs = n;
return n;
}
utils.h
#ifndef UTILS_H
define UTILS_H
int ByteArr2Bitstr(int ba,int * bs);
int Bitstr2ByteArr(int * bs,int ba);
endif
`
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通