Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从图像读取十六进制数据时出现问题-python会自动转换为字符串_Python_String_Image_Hex - Fatal编程技术网

从图像读取十六进制数据时出现问题-python会自动转换为字符串

从图像读取十六进制数据时出现问题-python会自动转换为字符串,python,string,image,hex,Python,String,Image,Hex,我用read(1)一次读取一个图像中的一个字节,并将其附加到一个列表中。图像数据都是十六进制数据。使用print功能打印列表时,其格式为'\xd7' ['\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7',...] 问题是现在我需要对这个十六进制数据执行一些计算,但是它是字符串格式的,python中的任何int或hex转换函数都不支持这个'\xd'字符串格式。它们需要一个'0xd7'或只需要一个'd7' 感谢您的帮助它将它们解释为字符,因

我用read(1)一次读取一个图像中的一个字节,并将其附加到一个列表中。图像数据都是十六进制数据。使用
print
功能打印列表时,其格式为
'\xd7'

['\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7',...]
问题是现在我需要对这个十六进制数据执行一些计算,但是它是字符串格式的,python中的任何int或hex转换函数都不支持这个'\xd'字符串格式。它们需要一个
'0xd7'
或只需要一个
'd7'


感谢您的帮助

它将它们解释为字符,因此请使用ord将它们转换为数字。即,
ord('\xd7')
215

另外,如果您使用Windows,或者程序可能必须在Windows上运行,请确保已以二进制模式打开文件:
open(“imagefile.png”、“rb”)
。在其他操作系统上没有区别。

read()
可以采用大于1的大小值:
read(1024)
将从流中读取1K字节。这比一次读取一个字节并将其附加到以前的字节要快得多

打印数据时,您要做什么?查看字节值,还是显示图像


数据不是“字符串格式”,只是字节,但当你打印它们时,打印例程会将非打印值转换成对人类眼睛和大脑更重要的内容。如果希望在不转义的情况下查看值,可以迭代字节,并将其转换为十六进制值、十进制值或二进制值—任何适合您和您的应用程序的值。这将是一个很好的起点。

您可以这样做,将它们放入数字数组中:

import array

data = array.array('B') # array of unsigned bytes

with open("test.dat", 'rb') as input:
    data = input.read(100)
    data.fromstring(data)

print data
# array('B', [215, 215, 215, 215, 215, 215, 215])

如果你正在做图像处理,那么你可能想看看numpy

有几个软件包也可以帮助您将图像读入内存(上面提到了PIL,另一个是我自己的或)

如果数据作为原始数据存在于文件中,并且您知道维度,则可以执行以下操作

import numpy as np
img = np.empty( (n_rows, n_cols), dtype=np.uint8) # create an empty image
img.data[:] = input_file.read()
将数据输入
img


python图像处理的入门网站是。

如果您需要
'd7'
'0xd7'
,而不是简单的
0xd7
(即215),
hex()
'%x'
是您的朋友

>>> ord('\xd7')
215
>>> ord('\xd7') == 215 == 0xd7
True
>>> hex(ord('\xd7'))
'0xd7'
>>> '%x' % ord('\xd7')
'd7'

另外,正如在其他答案中所观察到的,一定要确保在模式下用“b”打开,否则它可能会出错,认为它是UTF-8或类似的东西,在某些字节序列上。

b
适用于Windows,但不适用于Linux或Mac。谢谢,我不知道这一点。尽管如此,编写在任何地方都能正常工作的代码是一种很好的做法。@Greg:
b
在*x框上不是必需的。但是,您应该始终使用
b
,这样您的代码是可移植的,并且任何阅读您的代码的人都可以清楚地看到您的意图。我不知道您想做什么,但是您知道Python映像库吗?这可能比自己处理图像数据更容易。虽然对于Python2.6+来说,对字节数据使用
数组
过于复杂-只需使用bytearray:
b=bytearray(input.read(100))
,不需要导入任何内容,也可以使用无需
ord
的普通索引。(最好避免隐藏内置的
字节
类型)。@Scott Griffiths:我最初是用
bytearray
编写的,但注意到它们像字符串一样打印,并认为“复杂”是值得的,加上
数组
模块已经存在很长时间了,很长一段时间,所以这将适用于更多的旧版本的Python(仍然存在)。