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

问题描述 投票:0回答:1

我有一个二进制文件,包含以下数据:

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()
的文档似乎没有提及任何有关此行为的信息

c++ winapi readfile cl
1个回答
1
投票

ReadFile()
没有你正在读入的那种缓冲区的概念。它只读取原始字节。它确实保留了字节的顺序。

多字节整数(

uint16_t
是2个字节,
uint32_t
是4个字节)服从endian(即byte order),这就是你正在经历的。字节本身没有被反转。整数的values取决于字节被解释order。相同的字节序列可以表示不同的数值,具体取决于字节是以 little endian 还是 big endian 字节顺序解释的。

例如,2 字节序列

00 e0
表示
uint16_t
值在小端中为
53744
(十六进制 0xE000),在大端中为
224
(十六进制 0x00E0)。

© www.soinside.com 2019 - 2024. All rights reserved.