代码之家  ›  专栏  ›  技术社区  ›  Riccardo Petraglia

python3中十六进制的解码列表

  •  1
  • Riccardo Petraglia  · 技术社区  · 7 年前

    我有一个十六进制列表,我想把它转换成一个unicode字符列表。这里的一切都是用python-3.5完成的。

    如果我这样做 print(binary.fromhex('hex_number').decode('utf-8')) 它起作用了。但如果在转换后,我再次将字符存储在列表中,则不起作用:

    a = ['0063'] # Which is the hex equivalent to the c char.
    b = [binary.fromhex(_).decode('utf-8') for _ in a]
    print(b)
    

    ['\x00c']
    

    而不是

    ['c']
    

    而代码

    a = ['0063']
    for _ in a:
        print(binary.fromhex(_).decode('utf-8'))
    

    打印,预计:

    c
    

    有人能给我解释一下如何转换列表吗 ['0063'] 在列表中 ['c'] 为什么我会有这种奇怪的行为?

    0063 十六进制对应外观 here .

    2 回复  |  直到 7 年前
        1
  •  2
  •   Martijn Pieters    7 年前

    如果0063是,您没有UTF-8数据 U+0063 LATIN SMALL LETTER C . 充其量 你有 UTF-16 data ,大端顺序:

    >>> binary.fromhex('0063').decode('utf-16-be')
    'c'
    

    您可能需要检查您的 满的 数据以a开头 Byte Order Mark ,对于大端UTF-16 'FEFF' 在十六进制中,此时可以放下 -be 'FFFE' 相反,你有 小端 对UTF-16进行编码,然后在错误的点对数据进行切片;在这种情况下,你带着 '00' 前一个代码点的字节。

    UTF-8 是一个 可变宽度 编码。Unicode标准中的前128个码点(对应于ASCII范围)直接编码为单字节,直接映射到ASCII标准。拉丁语-1范围及以上的代码点(高达U+07FF (*) ,接下来的1919个代码点)映射到两个字节,等等。

    如果你的输入真的是UTF-8,那么你真的有一个 \x00 NULL character 在此之前 'c' . 打印NULL会导致许多终端上没有输出,但您可以使用 cat -v 将这些不可打印的字符转换为 插入符号转义码 :

    $ python3 -c "print('\x00c')"
    c
    $ python3 -c "print('\x00c')" | cat -v
    ^@c
    

    ^@ 是中NULL的表示形式 caret notation 使用人 cat .


    U+07FF当前未映射为Unicode;当前可能的最后一个UTF-8双字节码点是 U+07FA NKO LAJANYALAN .

        2
  •  1
  •   Ahmad Yoosofan    7 年前
    a = ['0063'] # Which is the hex equivalent to the c char.
    b = [chr(int(x,16)) for x in a]
    print(b)
    

    幸亏 1