c++ 为什么Win32 ReadFile()在写入uint16_t数组缓冲区时不保留字节顺序[duplicate]

b1payxdu  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(158)

此问题在此处已有答案

Why the byte are upside down?(5个答案)
昨天关门了。
我有一个二进制文件,包含以下数据:

00e0 a248 6000 611e 6200 d202 d212 7208
3240 120a 6000 613e 6202 a24a d02e d12e
...

当我使用ReadFile()并将目标缓冲区设置为uint8_t数组时,写入的缓冲区数据与源文件数据匹配:

uint8_t rom[256];
ReadFile(_, rom, _, NULL, NULL);
// in rom
rom[0x00000000] 0x00
rom[0x00000001] 0xe0
rom[0x00000002] 0xa2
rom[0x00000003] 0x48
rom[0x00000004] 0x60
rom[0x00000005] 0x00
rom[0x00000006] 0x61
...

为什么当我使用ReadFile()uint16_t数组时,每个元素的字节都写反了?

uint16_t rom[256];
ReadFile(_, rom, _, NULL, NULL);
// in rom
rom[0x00000000] 0xe000
rom[0x00000001] 0x48a2
rom[0x00000002] 0x0060
rom[0x00000003] 0x1e61
rom[0x00000004] 0x0062
rom[0x00000005] 0x02d2
rom[0x00000006] 0x12d2
...

同样的模式似乎也存在于较大的类型中:

uint32_t rom[256];
ReadFile(_, rom, _, NULL, NULL);
// in rom
rom[0x00000000] 0x48a2e000
rom[0x00000001] 0x1e610060
rom[0x00000002] 0x02d20062
rom[0x00000003] 0x087212d2
rom[0x00000004] 0x0a124032
rom[0x00000005] 0x3e610060
rom[0x00000006] 0x4aa20262
...

ReadFile()的文档似乎没有提到任何有关此行为的内容

pkwftd7m

pkwftd7m1#

ReadFile()对你要阅读的缓冲区类型没有概念,它只读取原始字节,而且它确实保留了字节的顺序。
多字节整数(uint16_t为2字节,uint32_t为4字节)受endian约束(即,字节顺序),这就是你所经历的。2字节本身没有被反转。3整数的 * 值 * 取决于字节被 * 解释 * 的 * 顺序 *。相同的字节序列可以表示不同的数值,具体取决于字节是按little endian还是big endian字节顺序解释的。
例如,2字节序列00 e0表示53744(十六进制0xE000)的小端值和224(十六进制0x00E0)的大端值。

相关问题