memcpy反转数据,C语言

Ric*_*des 0 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
 */
Run Code Online (Sandbox Code Playgroud)

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

dbu*_*ush 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");
Run Code Online (Sandbox Code Playgroud)

由于string是一个数组,unsigned char并且您正在为实现DES而进行位操作,因此您根本不需要更改它.只需使用它.


tad*_*man 5

看起来你刚刚意外发现了CPU如何存储整数值.有两种竞争学派被称为endian,在野外发现了little-endian和big-endian.

如果你想按字节顺序排列它们,整数类型将是有问题的,应该避免.只需使用一个字节数组.

有一些转换函数可以从一种endian形式转换到另一种形式,尽管在转换之前你需要知道你的架构使用了什么类型.

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