memcpy 反相数据,C语言

memcpy inverting data, C language

我在这里有疑问,我正在尝试使用 memcpy()string[9] 复制到 unsigned long long int 变量,代码如下:

unsigned char string[9] = "message";
string[8] = '[=10=]';
unsigned long long int aux;

memcpy(&aux, string, 8);
printf("%llx\n", aux); // prints inverted data

/* 
 * expected: 6d65737361676565
 *  printed: 656567617373656d
 */

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

您的系统对整数使用小端字节序。这意味着最低有效字节在前。例如,一个 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 而进行位操作,所以根本不需要更改它。照原样使用。

看来您只是无意中发现了 CPU 如何存储整数值。有两个相互竞争的思想流派被称为 endian,小端和大端都在野外被发现。

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

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

因此,如果您正在读取二进制值,则必须知道它的字节序形式,以便将其正确导入本机 int 类型。在编写二进制文件时选择一致的字节序格式以避免猜测通常是一个很好的做法,其中绝大多数 Internet 协议中使用的 "network byte order" 方案是一个很好的默认值。然后你可以使用像ntohl这样的函数来回转换。