为什么我的 ByteString 在 x86_64 架构上采用 BigEndian 格式?

Gia*_*zza 2 x86 haskell endianness

这段代码:

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)
Run Code Online (Sandbox Code Playgroud)

在我的机器上产生以下输出(通过 xxd 运行):

00000000: 0102 0304                                ....
Run Code Online (Sandbox Code Playgroud)

它告诉我它是按大端顺序输出的,但我有一个 x86_64 系统,所以...发生了什么事?

Wil*_*sem 8

该模块在文档Data.Binary中指定:

使用Binary类编码的值始终以网络顺序(大端)形式进行编码,并且编码数据应该可以跨机器端、字大小或编译器版本移植。例如,使用 Binary 类编码的数据可以在任何机器上写入,并在任何另一台机器上读回。

因此,它不适用于机器的字节序,但始终使用大字节序,这样将对象编码为 a ByteString,也可以使用另一台机器进行解码。