大小端转换

源字节(内存)

↓ 字节序已转换 ↓

结果字节(内存)

# 输入 hex 输出 hex 无符号 有符号 二进制

字节序转换器

这是字节序转换器:把多字节 hex 值在内存里的顺序对调。 Endianness 是多字节值在内存中的字节顺序。big-endian、little-endian、PDP、uint32_t、htons、htonl、RFC 1700、__builtin_bswap 等标识不翻译。0x12345678 的 big-endian 内存是 12 34 56 78(MSB 在前,网络字节序)。little-endian(x86、ARM)是 78 56 34 12。PDP / 中间端是 34 12 78 56。显示示例就是这 4 字节、32 位、big-endian → little-endian。两个 32 位字 AA BB CC DD 11 22 33 44 交换后是 DD CC BB AA 44 33 22 11;全部倒序则是 44 33 22 11 DD CC BB AA。

如何使用

  1. 粘贴 hex。空格和 0x 会被去掉。除非全部倒序,长度必须是 2、4 或 8 字节的倍数。
  2. 选 16 位(uint16_t / htons)、32 位(uint32_t / htonl)或 64 位(htobe64)。每个字单独转换。
  3. 源/目标可选 big-endian、little-endian 或 PDP。对调 ⇄ 把结果填回并交换两种顺序。
  4. 看彩色格子(下标、hex、MSB/LSB)、表格(无符号、有符号、二进制)以及带 __builtin_bswap 的 C 片段。

内存布局与数值

格子就是调试器里的 dump:左边是地址 0。big-endian 和人写 hex 的顺序一致。little-endian 把最低有效字节放在最低地址,所以 0xDEADBEEF 的 dump 是 EF BE AD DE。无符号是按源字节序解码后的整数;有符号是同宽度补码。单字节(uint8_t)没有字节序。

网络字节序、Modbus 与 C

TCP/IP 字段是 big-endian(RFC 1700)。在 little-endian 主机上,16 位端口用 htons/ntohs,32 位用 htonl/ntohl。GCC/Clang 的 __builtin_bswap16/32/64 会编成 BSWAP;MSVC 用 _byteswap_ushort / _byteswap_ulong。Modbus 寄存器是 16 位 big-endian;跨两个寄存器的 32 位 float 还可能有字序(AB CD 与 CD AB)。交换 IEEE 754 时用 memcpy 进 uint32_t,不要写 *(uint32_t*)&f。

PDP / 中间端

PDP-11 把 32 位值存成两个 16 位字(字序 big-endian,字内 little-endian),所以 0x12345678 变成 34 12 78 56。部分工控设备仍用混合序。16 位 PDP 就是对调两个字节。

常见问题

  • 32 位却只有 3 字节会报错? 32 位字需要 4 字节的倍数。
  • 全部倒序等于 32 位交换吗? 只有一个字时相同。两个字会不同,见 AA BB CC DD 11 22 33 44。
  • 浮点呢? 用 IEEE 754 看 binary32/binary64,再用本页交换 hex。
  • 数据会离开浏览器吗? 不会。

相关工具

看浮点比特用 IEEE 754。看 dump 用 Hex Dump。读整数用 十六进制转十进制。

要处理整数值? 十六进制转十进制 →