【发布时间】:2013-12-24 20:35:33
【问题描述】:
我被问到一个面试问题:给定一个 6 字节的输入,它来自一个大字节序的机器,请实现一个函数将它转换/类型转换为 8 个字节,假设我们不知道运行这个函数的机器的字节序.
问题的重点似乎是在测试我对字节序的理解,因为在这个问题之前我被问到我是否知道字节序。
我不知道如何回答这个问题。例如我需要先将 6 字节填充到 8 字节吗?如何?这是我的代码。这是正确的吗?
bool isBigEndian(){
int num = 1;
char* b = (char*)(&num);
return b ? false:true;
}
long long* convert(char* arr[]){ //size is 6
long long* res = (long long*)malloc(long long);//...check res is NULL...
if (isBigEnian()){
for(int i = 0; i< 6; i++)
memset(res, i+2, arr[i]);
}
else {
for(int i = 0; i< 6; i++)
memset(res, i+2, arr[6-1-i]);
}
return res; //assume caller will free res.
}
更新:回答我的问题不清楚,我刚刚找到了一个链接:Convert Bytes to Int / uint in C 与类似的问题。根据我的理解,主机的字节序确实很重要。假设如果输入是:char array[] = {01,02,03,04,05,06},那么如果主机是小端,输出存储为00,00,06,05,04,03,02,01 , 如果是大端,输出将存储为 00,00,01,02,03,04,05,06,在这两种情况下,0000 都会在开头填充。
我现在有点明白了:在另一台机器上,假设有一个数字xyz = 010203040506,因为它是bigendian,01是MSB。所以它被存储为 char array = {01,02,03,04,05,06} 其中 01 具有最低地址。那么在这台机器上,如果机器也是大端的。它应该存储为 {00,00,01,02,03,04,05,06 } 其中 01 仍然是 MSB,因此它被转换为相同的数字 int_64 xyz2 = 0000010203040506。但如果机器是小端,它应该存储为 {00,00,06,05,04,03,02,01 } 其中 01 是 MSB 的最高地址,以便 int_32 xyz2 = 0000010203040506。
如果我的理解有误,请告诉我。谁能告诉我为什么不管什么字节序总是在开头填充 0000 ?如果这台机器是小端序的,不应该在最后填充吗,因为 00 是最符号字节?
【问题讨论】:
-
要回答这个问题,您需要对从 6 字节“转换”为 8 字节的含义进行一些定义。
-
另外,我没有合理的方法可以看出字节序无关紧要。
-
也许问题的重点是看你是否会要求澄清或继续缺乏规范。
-
听起来有点像base64编码。
-
convert 表示在给定字节序条件的情况下如何将 6 字节存储在 8 字节变量中。