memcpy反转数据,C语言

时间:2018-10-12 19:43:42

标签: c memcpy string.h

我在这里有疑问,我正在尝试使用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
 */

如何在不反转数据的情况下制作此副本?

2 个答案:

答案 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");

由于stringunsigned char的数组,并且您出于实现DES的目的而进行位操作,因此根本不需要更改它。照原样使用。

答案 1 :(得分:5)

就像您偶然发现了CPU如何存储整数值。有两种相互竞争的思想流派,称为endian,在野外发现了小尾数法和大尾数法。

如果您希望它们按字节顺序排列,则整数类型会出现问题,应避免使用。只需使用字节数组即可。

有些转换函数可以从一种字节序形式转换为另一种字节序形式,尽管在正确转换之前您需要知道您的体系结构使用哪种排序。

因此,如果您要读取二进制值,则必须知道它的字节序形式,以便将其正确导入本机int类型。通常,在编写二进制文件时选择一致的字节序形式是一种很好的做法,以避免猜测,因为绝大多数Internet协议中使用的“网络字节顺序”方案是很好的默认设置。然后,您可以根据需要使用htonlntohl之类的函数来回转换。