0

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

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

4

2 回答 2

5

您的系统对整数使用 little endian 字节排序。这意味着最低有效字节首先出现。例如,一个 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 进行位操作,因此您根本不需要更改它。就当它用吧。

于 2018-10-12T19:47:00.313 回答
5

看起来您刚刚偶然发现了 CPU 是如何存储整数值的。有两种相互竞争的思想流派被称为endian,little-endian 和 big-endian 都在野外发现。

如果您希望它们按字节顺序排列,那么整数类型将是有问题的,应该避免使用。只需使用一个字节数组。

有一些转换函数可以从一种 endian 形式转换为另一种形式,但在正确转换之前您需要知道您的体系结构使用哪种类型。

因此,如果您正在读取二进制值,则必须知道它的字节序格式才能正确地将其导入本机int类型。在编写二进制文件以避免猜测时,选择一致的字节序形式通常是一个好习惯,其中绝大多数互联网协议中使用的“网络字节顺序”方案是一个很好的默认值。然后,您可以根据需要使用和等函数htonl来回ntohl转换。

于 2018-10-12T19:47:31.267 回答