我有一个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(它是向后),则它 表示数据是以不同于您自己的格式编写的。你会 必须翻译它。
谁是对的,为什么我会得到相互矛盾的答案?
答案 0 :(得分:0)
" Macbook Pro的终结"没意思。你需要更加详细;不同的应用程序会有不同的印象。正如您刚刚看到的那样,您可以随意对文件中的字节进行编码。最后,一系列字节就是这样,文件最终只是一系列可以以任何方式读取的字节。在编程(Stack Overflow)的上下文中,重要的是知道a)你得到的输入是Big Endian还是Little Endian,以及b)你发送的输出是应该是Big Endian还是Little Endian。
如果您的问题是传统的文件阅读,答案通常是Little Endian。但是,例如,网络数据往往是Big Endian。