【问题标题】:Parse hex and ASCII characters into string in Python在 Python 中将十六进制和 ASCII 字符解析为字符串
【发布时间】:2019-08-23 12:37:25
【问题描述】:

我有一个文件,其行如下:\x04\x01\x00\x00\x00\x00\x00{,我想像这样解析它:04:01:00:00:00:00:00:7b,其中{ 必须转换为十六进制({ = 7b)。

我正在尝试构建一个小的 python 脚本,但是将一些(不是全部)字符转换为十六进制的棘手部分对我来说很难。

这是我的入门方法:

def hex_parser(line):
    result = ''
    for l in line:
        if len(result):
            result = result + ':'
        if l != '\\' or l != ',' or l != '\n':
            tmp_l = l.encode('utf8').hex()
            if len(tmp_l) == 1:
                tmp_l = '0' + tmp_l
            result = result + tmp_l
    return result

感谢您的帮助。

【问题讨论】:

    标签: python hex ascii data-conversion


    【解决方案1】:

    这条线会满足你的要求:

    result = ":".join([f"{ord(hex_value):02X}" for hex_value in line if hex_value not in ['\\','\n',',']])
    

    这适用于行中的每个字符,跳过列表中定义的字符:

    1. 使用ord 转换为整数。 '\x00' = 0, '{' = 123
    2. 使用字符串格式转换为两位十六进制数

    最后,它获取列表并将每个部分连接成一个字符串,每个元素之间都有一个:

    编辑:

    这是一个函数,它解析文本文件中包含实际十六进制表示 (\x00) 的行,从而在 python 中生成类似 \\x00 的字符串

    import re
    
    def hex_parser(line):
        hex_values = []
        i = 0
        while i < len(line):
            if re.match("\\\\x[A-Fa-f0-9]{2}",line[i:i+4]):
                hex_values.append(line[i+2:i+4])
                i+= 4
            else:
                hex_values.append(f"{ord(line[i]):02X}")
                i += 1
        skip_values = [f"{ord(c):02X}" for c in ['\\','\n',',']]
        return ":".join([h for h in hex_values if h not in skip_values])
    
    

    【讨论】:

    • 我什么都不懂:当我将您的行与这样的字符串示例一起使用时:hex_parser("\x04\x00\x00\x00\x00\x00\x00/") 其中 hex_parser 只是您的行的返回,它可以工作。但是当我打开文件,读取它并传递存储在变量中的完全相同的值时,python 想要转换每个字符(甚至是\x00 中的第一个 x。我想当我直接传递字符串时,python 会解释它就像一个十六进制字符串,但是对于文件它不会做同样的事情
    • 取决于文件的外观。当您在 python 中键入 "\x00" 时,这意味着它是一个长度为 1 的字符串,其中包含一个 null 字符。如果您有一个包含\x00 的文件然后读取它,那么它将是一个长度为4 的字符串,其中包含字符\ 、x、0 和0
    • 你的权利,在我的情况下,文件是一个 txt 文件,所以每个十六进制行都被视为 x 是一个字符......你有什么想法绕过这个问题吗? (将文件转换为十六进制或类似的东西)
    • 文本文件的实际外观如何?它是否有\x00 或像€eYäþšÈ[È 这样的“随机”字符?
    • 添加了解析\x00-like 文本块的函数,希望对你有所帮助
    【解决方案2】:

    尝试以二进制方式读取文件:

    with open("file.txt", "rb") as f:
        for l in f.readlines(): # reads the file line by line
            print(":".join(["%02x"%ord(c) for c in l])) # go through each character and format it as hex string, put all together with ":" inbetween
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多