检查十六进制代码类型

时间:2014-04-29 00:14:20

标签: python dictionary

我有一个字典,其中包含从JPEG的EXIF数据中提取的键值对。对于某些JPEG,我得到了几个值的奇怪字符串,我一直在试图弄清楚如何处理它。我猜它被称为二进制十六进制代码,或类似的东西,我还没有找到很多信息,而且这超出了我的正常驾驶室。

值如下所示:

>>> components_config
'\x01\x02\x03\x00'

或者这个:

>>> scenetype
'\x01'

它的类型是str:

>>> type(components_config)
<type 'str'>

当我尝试使用它时它想要这样显示:

>>> for c in components_config:
    print c
[]    # note, these are rectangles (connected on all sides) that
[]    # I can't copy over
[]
[]

我发现我可以让它像这样可读:

>>> binascii.hexlify(components_config)
'01020300'

或者如果它只是一个十六进制的东西:

>>> ord(scenetype)
1

但我坚持的问题是如何识别字典中的值是否是其中之一?字典中包含tupleintstring类型。我希望能够将这些值拉出来并将它们变为ints,但是,我尝试识别它们的所有内容都失败了。这是一个例子:

>>> components_config.find('\\')
-1

>>> components_config.startswith(r'\x')
False

所以正常的字符串操作在这里工作。类型检查只是返回字符串,这使我没有任何工作。有没有其他方法可以检查该值是否为此十六进制类型?

谢谢!

我使用的是2.7,顺便说一句。

编辑:感谢您的回答和评论,但我仍然无法指定何时调用struct方法或针对这些特定值的任何其他方法。

struct.unpack(HH, var)可以将其转换为我想要的值,但我无法在dict的每个值上调用它,因为我也有常规字符串。我怎么知道当我迭代这个特定的字符串时,它是我需要调用struct.unpack()的那个?类似的东西:

if type(var) == 'hex':
    struct.unpack('HH', var)

3 个答案:

答案 0 :(得分:0)

您是否尝试将字符串编码为UTF-8

>>> print '\x01\x02\x03\x00'.encode("utf")
☺☻♥

其他评论结果:

>>> import struct
>>> print struct.unpack('HH', '\x01\x02\x03\x00')
(513, 3)

不确定您正在查看哪些数据。 :d

答案 1 :(得分:0)

你想要结构模块:

https://docs.python.org/2.7/library/struct.html

  

此模块执行Python值和表示为Python字符串的C结构之间的转换。这可用于处理存储在文件中的二进制数据或来自网络连接以及其他来源。它使用Format Strings作为C结构布局的简洁描述以及与Python值的预期转换。

答案 2 :(得分:0)

我再看看这个,我现在有办法看看我得到的字符串是否是字节码。我承认这不是万无一失的,但这是一个开始:

foos = ['\x01\x02\x03\x00', 'regular string']
for f in foos:
    if ord(f[0]) is 1:
        print f

基本上,十六进制代码的每个部分都是单独索引的,即:

x[0] = '\x01'

因为到目前为止我遇到的所有这些都以1开头并且没有实际的字符串,所以这个测试似乎很好地过滤掉了结果。