当我试图找出我的Macbook Pro的字节序时,答案相互矛盾

时间:2015-11-21 02:24:23

标签: endianness

我有一个Macbook Pro,当我试图确定其结尾时,我得到了相互矛盾的答案。

  

方法1

python -c "import sys;print sys.byteorder" tells me I am on a little endian system
  

方法2

我有一个文本文件。我使用iconv将其转换为UTF16。它应该检测计算机的字节顺序并将其转换为该格式。所以我走了:

iconv -f utf-8 -t utf-16 file.txt > utf16.txt
file utf16.txt
utf16.txt: Big-endian UTF-16 Unicode English text

vi utf16.txt有效且hexdump -C utf16.txt显示:

00000000  fe ff 00 33 00 39 00 38  00 31 00 36 00 30 00 38  |...3.9.8.1.6.0.8|

00000010  00 09 00 54 00 69 00 61  00 20 00 4a 00 75 00 61  |...T.i.a. .J.u.a|

00000020  00 6e 00 61 00 20 00 52  00 69 00 76 00 65 00 72  |.n.a. .R.i.v.e.r|

00000030  00 09 00 54 00 69 00 61  00 20 00 4a 00 75 00 61  |...T.i.a. .J.u.a|

00000040  00 6e 00 61 00 20 00 52  00 69 00 76 00 65 00 72  |.n.a. .R.i.v.e.r|

00000050  00 09 00 52 00 69 00 6f  00 20 00 54 00 69 00 61  |...R.i.o. .T.i.a|

00000060  00 6a 00 75 00 61 00 6e  00 61 00 2c 00 52 00 69  |.j.u.a.n.a.,.R.i|

00000070  00 6f 00 20 00 54 00 69  00 6a 00 75 00 61 00 6e  |.o. .T.i.j.u.a.n|

00000080  00 61 00 2c 00 52 00 ed  00 6f 00 20 00 54 00 69  |.a.,.R...o. .T.i|

00000090  00 6a 00 75 00 61 00 6e  00 61 00 2c 00 54 00 69  |.j.u.a.n.a.,.T.i|

如果我将其转换为little-endian并手动插入这样的BOM:

( printf "\xff\xfe" ; iconv -f utf-8 -t utf-16le file.txt ) > UTF16LEBOM.txt
file UTF16LEBOM.txt
UTF16LEBOM.txt: Little-endian UTF-16 Unicode English text

vi UTF16LEBOM.txt有效

hexdump -C UTF16LEBOM.txt显示

00000000  ff fe 33 00 39 00 38 00  31 00 36 00 30 00 38 00  |..3.9.8.1.6.0.8.|

00000010  09 00 54 00 69 00 61 00  20 00 4a 00 75 00 61 00  |..T.i.a. .J.u.a.|

00000020  6e 00 61 00 20 00 52 00  69 00 76 00 65 00 72 00  |n.a. .R.i.v.e.r.|

00000030  09 00 54 00 69 00 61 00  20 00 4a 00 75 00 61 00  |..T.i.a. .J.u.a.|

00000040  6e 00 61 00 20 00 52 00  69 00 76 00 65 00 72 00  |n.a. .R.i.v.e.r.|

00000050  09 00 52 00 69 00 6f 00  20 00 54 00 69 00 61 00  |..R.i.o. .T.i.a.|

00000060  6a 00 75 00 61 00 6e 00  61 00 2c 00 52 00 69 00  |j.u.a.n.a.,.R.i.|

00000070  6f 00 20 00 54 00 69 00  6a 00 75 00 61 00 6e 00  |o. .T.i.j.u.a.n.|

00000080  61 00 2c 00 52 00 ed 00  6f 00 20 00 54 00 69 00  |a.,.R...o. .T.i.|

00000090  6a 00 75 00 61 00 6e 00  61 00 2c 00 54 00 69 00  |j.u.a.n.a.,.T.i.|

来自this链接:

  

另一种方法是包含一个幻数,例如0xFEFF,   在每一条数据之前。如果你读了幻数,那就是   0xFEFF,表示数据与您的机器格式相同,并且   一切都很好。

     

如果您读取幻数并且它是0xFFFE(它是向后),则它   表示数据是以不同于您自己的格式编写的。你会   必须翻译它。

谁是对的,为什么我会得到相互矛盾的答案?

1 个答案:

答案 0 :(得分:0)

" Macbook Pro的终结"没意思。你需要更加详细;不同的应用程序会有不同的印象。正如您刚刚看到的那样,您可以随意对文件中的字节进行编码。最后,一系列字节就是这样,文件最终只是一系列可以以任何方式读取的字节。在编程(Stack Overflow)的上下文中,重要的是知道a)你得到的输入是Big Endian还是Little Endian,以及b)你发送的输出是应该是Big Endian还是Little Endian。

如果您的问题是传统的文件阅读,答案通常是Little Endian。但是,例如,网络数据往往是Big Endian。