如何在 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 中从十六进制(字节字符串)中读取单个字符?的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中从字节字符串中删除前 20 个字节的最快方法是啥?