将base 4代码转换为字母

即时通讯工作我有一个assmebler项目,我需要翻译二进制机器代码,我有一个“奇怪的”4基本代码,例如,如果我得到这样的二进制代码“0000-10-01-00”我应该翻译它到“aacba”

00 =一

01 = B

10 = C

11 = d

我已设法将代码翻译成4个基本代码,但我不知道如何从那里继续,或者如果这是正确的方法,…

在下面添加我的代码

void intToBase4 (unsigned int *num) { int d[7]; int j,i=0; double x=0; while((*num)>0) { d[i]=(*num)%4; i++; (*num)=(*num)/4; } for(x=0,j=i-1; j>=0; j--) { x += d[j]*pow(10,j); } (*num)=(unsigned int)x; } 

我已经包含了一个32位到数字到字母转换器,以便您掌握基础知识。 它一次只能处理一个“32位数字”。 您可以将此作为基于数组的解决方案的基础,就像您在示例中完成了一半,或者将类型更改为更大或类似。 它应该向您展示您需要做的事情:

 void intToBase4 (uint32_t num, char *outString) { // There are 16 digits per num in this example for(int i=0; i<16; i++) { // Grab the lowest 2 bits and convert to a letter. *outString++ = (num & 0x03) + 'a'; // Shift next 2 bits low num >>= 2; } // NUL terminate string. *outString = '\0'; } 

更通用的一个:用法:value – 要解码的值,buff – buff将存储结果字符串,numofwrds – 要解码的字段数,…字段大小(以位为单位)

例如“xxxxyyvvzz”: – 4位,2位,2位,2位

 decode(v, buff, 4, 4, 2, 2, 2); 

 char dictionary[] = "abcdefghijklmnopqrstuwxyz"; char *decode(unsigned int value, char *buff, int numofwrds, ...) { va_list vl; int *fieldsizes = malloc(sizeof(int) * numofwrds); int bitsize = 0; char *result = NULL; if (fieldsizes != NULL) { va_start(vl, numofwrds); for (int i = 0; i < numofwrds; i++) { fieldsizes[i] = va_arg(vl, int); bitsize += fieldsizes[i]; } va_end(vl); for (int i = 0; i < numofwrds; i++) { unsigned int mask, offset; mask = (1 << fieldsizes[i]) - 1; offset = bitsize - fieldsizes[i]; mask <<= offset; buff[i] = dictionary[(value & mask) >> offset]; bitsize -= fieldsizes[i]; } free(fieldsizes); result = buff; } buff[numofwrds] = '\0'; return result; }