为什么x86_64架构下生成的ByteString是大端字节序格式?
问题原因说明
你观察到的输出字节序和设备原生架构无关,是Haskell Data.Binary 库的设计特性导致的:
Data.Binary库的核心设计目标是提供跨平台统一的二进制序列化规则,默认所有数值类型的序列化都采用固定的大端字节序(网络字节序),不会跟随运行设备的原生字节序变化。即便是在x86_64这类小端架构设备上运行,序列化输出的Int32值仍然是大端排列的01 02 03 04。- 这种设计可以避免不同字节序的设备之间传输序列化后的数据时出现解析错误,不需要额外标记字节序就能实现跨设备数据互通。
- 如果你需要得到和主机原生字节序一致的序列化结果,可以自行实现
Binary类型类实例,调用对应字节序的底层写入接口即可。
参考代码与运行结果
你运行的测试代码如下:
import Data.Binary import qualified Data.ByteString.Internal as BS (c2w, w2c) import qualified Data.ByteString.Lazy as B import Data.Int main :: IO () main = do B.putStr $ encode $ (0x01020304 :: Int32)
执行后通过xxd得到的输出为:
00000000: 0102 0304 ....
内容的提问来源于stack exchange,提问作者Gianluca Corazza
相关产品推荐
相关产品推荐

