任務要求

  1. 在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

`

運行截圖