[英]How to convert java byte[] to python string?
我知道java和python处理字节的方式不同,所以我对如何将byte []转换为python字符串感到有些困惑,我在Java中有这个byte []
{ 118, -86, -46, -63, 100, -69, -30, -102, -82, -44, -40, 92, 0, 98, 36, -94 }
我想将其转换为python字符串,这是我的方法
b=[118, -86, -46, -63, 100, -69, -30, -102, -82, -44, -40, 92, 0, 98, 36, -94]
str=""
for i in b:
str=str+chr(abs(i))
但是我不确定这是否是正确的方法。
字符串连接是非常低效的。
我建议使用空分隔符在传递给str.join
的生成器理解中做到这一点:
s = "".join([chr(abs(x)) for x in b])
编辑: abs
位很奇怪。 它可以执行请求的操作,但是由于byte
已签名,因此没有任何用处。 因此,您需要像Martijn答案中那样的二进制补码,以解决下一个OP问题:数据有效性:)
如果您在表中有一些ASCII值列表是可以的(并且放下abs
允许我们使用map
,但是很少能够使用它,所以我们不致于使它无法使用:)
items = [65, 66, 67, 68]
print("".join(map(chr,items)))
结果:
"ABCD"
Java byte
类型是有符号整数 ; 值范围介于-128和127之间。Python的chr
期望值介于0和255之间。 在Java教程的“ 原始数据类型”部分中:
byte :字节数据类型是8位带符号的二进制补码整数。 最小值为-128,最大值为127(含)。
您需要将补码从2s转换为无符号整数:
def twoscomplement_to_unsigned(i):
return i % 256
result = ''.join([chr(twoscomplement_to_unsigned(i)) for i in b])
但是,如果这是Python 3,则您确实要使用bytes
类型:
result = bytes(map(twoscomplement_to_unsigned, b))
假设您使用的是Python 3,则可以从列表中初始化字节。 您首先需要将有符号整数转换为无符号字节。
items = [118, -86, -46, -63, 100, -69, -30, -102, -82, -44, -40, 92, 0, 98, 36, -94]
data = bytes(b % 256 for b in items)
print(data) # b'v\xaa\xd2\xc1d\xbb\xe2\x9a\xae\xd4\xd8\\\x00b$\xa2'
如果字节代表文本,请随后对其进行解码。 在您的示例中,它们不代表编码为UTF-8的文本,因此将失败。
data = data.decode('utf8')
print(data)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.