每当我尝试打开二进制文件(例如图像或 exe 程序)时,我都看不到 0 和 1,而只看到一些内容,例如 \x00\x8fi>\x9f\xd2\x98\x16\ 这些是二进制数据吗?
我正在使用:python 3.7,输出在 windows 10 pro 上的 cmd 上,我通过“rb”而不是“r”执行了 file.read()
答案1
这些价值观是十六进制。
十六进制是使用 16 进制表示数字的一种方式
二进制是一种使用二进制(0,1)表示数字的方式。
数字相同,但显示不同之处在于二进制 00001111 比十六进制 0f(通常显示为 x0f,x 表示“十六进制”)更详细。
对于计算机来说,该值是 00001111,但显示给您的内容信息量更大,也更容易“思考”,因为人类习惯于以十进制 (十进制) 思考。该数字使用完全相同的二进制位存储在内存中,以完全相同的方式用于计算,并给出完全相同的结果。
唯一的区别在于如何向您作为用户显示号码。
你可能想阅读如何转换二进制、十进制和十六进制因为了解我们使用的数字只是彼此的表示形式很有用,根据您的情况,可以更轻松地使用它们。一旦您掌握了十六进制,它就是一种比普通十进制更好的计算机数据表示形式。
看来您可能也在文本编辑器中打开二进制文件。如果您在记事本中打开二进制文件,那么您可能会看到程序将字符视图与十六进制视图混合在一起。字符只不过是一定范围内的二进制数据,并且在该范围内,文本编辑器会将它们显示为“文本”而不是十六进制值。如果您想查看正确的文件数据而无需解释,请使用十六进制查看器,而不是文本编辑器。
答案2
假设 Linux 在某些情况下
在 python 中,您可以以“可显示”格式显示任何数据,该格式由repr(value)
值为任何变量(或文字?)创建。
现在数据总是相同的,直到您直接或隐式地转换它。
最常见的情况是决定如何解释或显示数据。
该file
命令将尝试通过查找某些数据模式来识别文件的内容。然后在与“文件”可执行文件一起创建的数据文件中定义“什么”是什么内容。
现在,可以用这种样式创建简单的文本文件:
$ echo >test.txt "Hello, World!"
然后使用od
实用程序检查/显示以验证文件内容......
$ od -t x1z test.txt
0000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a >Hello, World!.<
0000016
$ ls -l test.txt
-rw-rw-r-- 1 hannu hannu 14 maj 26 19:08 test.txt
$ date
tis 26 maj 2020 19:08:58 CEST
$ od -t x1z test.txt
0000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a >Hello, World!.<
0000016
$ od -t o1z test.txt
0000000 110 145 154 154 157 054 040 127 157 162 154 144 041 012 >Hello, World!.<
0000016
$ od -t a test.txt
0000000 H e l l o , sp W o r l d ! nl
0000016
$
因此,数据是相同的,只是以不同的格式解释或显示
(man od
看看这个实用程序除了上述功能之外还能做什么)
当您使用 Excel(例如 LibreOffice Calc)时,您有类似的可能性;但更倾向于根据实际单元格内容来格式化您显示的数据。
例如,数字“25569”可以看作是以不同方式格式化的数字,带有千位分隔符、小数点等。或者设置为日期时;1970-01-01
(至少在 LbreOffice 中;按住 CTRL,按 1,然后单击Date
出现的对话框 - 在 Excel 中也是一样)。
更多 Python?
$ python3
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f=open('test.txt','rb')
>>> s=f.readline()
>>> s
b'Hello, World!\n'
>>> s.decode()
'Hello, World!\n'
>>> print(s.decode())
Hello, World!
>>> print(repr(s))
b'Hello, World!\n'
>>> from binascii import *
>>> hexlify(s)
b'48656c6c6f2c20576f726c64210a'
>>> quit()
$