繁体   English   中英

如何将java byte []转换为python字符串?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM