我有一个二进制文件,包含以下数据:
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()
的文档似乎没有提及任何有关此行为的信息
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)。