如何在 Python 中从十六进制(字节字符串)中读取单个字符?

Posted

技术标签:

【中文标题】如何在 Python 中从十六进制(字节字符串)中读取单个字符?【英文标题】:How to read the single characters from a hex (bytes string) in Python? 【发布时间】:2016-10-29 20:24:52 【问题描述】:

标题中的问题可能无法反映我到底想要什么……我会在这里尽力而为。

我将以下十六进制字符串表示为字节字符串:

s='\x00\x00\x01b?\x90bM\xe0\x00\x00\x00'

我有一个 hbase 表,其中行键的格式与“s”相同。但是当我以这种格式传递范围时会产生错误:"utf-8 cannot decode byte..."

sparkconf = "hbase.zookeeper.quorum": "myHostIP","hbase.mapreduce.inputtable": "myHbaseTable","hbase.mapreduce.scan.columns": "c1:c2", "hbase.mapreduce .scan.row.start": startRow, "hbase.mapreduce.scan.row.stop": endRow

好像 startRow 和 endRow 必须是字符串?

如果是这样,有没有办法将 s='\x00\x00\x01b?\x90bM\xe0\x00\x00\x00' 格式化/转换为一串相同的字符?

我的意思不是转换 Hex t 字符串,我的意思是我需要一个字符串,例如 str_s=MAKESTRING(s) 会导致 str_s='\x00\x00 \x01b?\x90bM\xe0\x00\x00\x00' 其中 str_s[0]='\'、str_s[1]='x'、str_s[2]='0' 等。 ..

非常感谢您的帮助,我是 python、pyspark 和 hbase 的新手。

【问题讨论】:

你的字符串是从哪里来的?你会以某种方式生成它吗? 是的,前 4 个字节是 int,后 8 个字节是 double。所以,确切的问题是:不清楚 hbase_rdd = sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache .hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=sparkconf) 正在解释开始行和结束行。我已经解决了 utf-8 问题,如下所示: s=u'\x00\x00\x01b?\x90bM\xe0\x00\x00\x00' s=s.encode('utf-8') 但我越来越空了从范围扫描设置!感谢您的帮助 当我在扫描中使用来自 hbase shell 的相同范围(开始和结束)和相同格式时,它可以工作,但不能使用 newAPIHadoopRDD! 【参考方案1】:

您可能想要使用类似以下的内容:

def printable_repr(s):
    """ Convert to a printable representation.

    Replace each nonprintable ascii byte in s by its 
    hex representation (\xXX)
    """
    printable_s = []
    for c in s:
        if 32 <= ord(c) and ord(c) <= 126:
            printable_s.append(c)
        else:
            printable_s.append("\\%02x" % ord(c))
    return ''.join(printable_s)


s = '\x00\x00\x01b?\x90bM\xe0\x00\x00\x00'
s_str = printable_repr(s)

print("s_str: " + s_str)

for i in range(0, len(s_str)):
    print(str(i) + ": " + s_str[i])

脚本产生这个输出(Python 3.4.2):

s_str: \00\00\01b?\90bM\e0\00\00\00
0: \
1: 0
2: 0
3: \
4: 0
5: 0
6: \
7: 0
8: 1    
9: b
10: ?   
11: \
12: 9
13: 0
14: b
15: M
16: \
17: e
18: 0
19: \
20: 0
21: 0
22: \
23: 0
24: 0
25: \
26: 0
27: 0

当然,如果您还想用十六进制表示替换可打印的 ascii 字符,您可以轻松地简化脚本。

【讨论】:

以上是关于如何在 Python 中从十六进制(字节字符串)中读取单个字符?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中从整数转换为二进制时保留整个字节[重复]

在 Python 中从字节字符串中删除前 20 个字节的最快方法是啥?

如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?

在python中从十六进制字符转换为Unicode字符

如何在 Python 中将字符串转换为字节数组

c# 中从十六进制到字节的最轻量级转换? [复制]