我在这里有疑问,我正在尝试使用memcpy()
将string[9]
复制到unsigned long long int
变量中,代码如下:
unsigned char string[9] = "message";
string[8] = '\0';
unsigned long long int aux;
memcpy(&aux, string, 8);
printf("%llx\n", aux); // prints inverted data
/*
* expected: 6d65737361676565
* printed: 656567617373656d
*/
如何在不反转数据的情况下制作此副本?
答案 0 :(得分:5)
您的系统正在对整数使用小端字节序。这意味着最低有效字节在前。例如,一个32位整数将存储258(0x00000102)为0x02 0x01 0x00 0x00。
与其将字符串复制为整数,不如遍历字符并以十六进制打印每个字符:
int i;
int len = strlen(string);
for (i=0; i<len; i++) {
printf("%02x ", string[i]);
}
printf("\n");
由于string
是unsigned char
的数组,并且您出于实现DES的目的而进行位操作,因此根本不需要更改它。照原样使用。
答案 1 :(得分:5)
就像您偶然发现了CPU如何存储整数值。有两种相互竞争的思想流派,称为endian,在野外发现了小尾数法和大尾数法。
如果您希望它们按字节顺序排列,则整数类型会出现问题,应避免使用。只需使用字节数组即可。
有些转换函数可以从一种字节序形式转换为另一种字节序形式,尽管在正确转换之前您需要知道您的体系结构使用哪种排序。
因此,如果您要读取二进制值,则必须知道它的字节序形式,以便将其正确导入本机int
类型。通常,在编写二进制文件时选择一致的字节序形式是一种很好的做法,以避免猜测,因为绝大多数Internet协议中使用的“网络字节顺序”方案是很好的默认设置。然后,您可以根据需要使用htonl
和ntohl
之类的函数来回转换。