如何将java字节[]转换为python字符串?
我知道java和python处理字节的方式不同,所以我对如何将byte[]转换为python字符串感到有点困惑 我在java中有这个字节[]如何将java字节[]转换为python字符串?,java,python,string,Java,Python,String,我知道java和python处理字节的方式不同,所以我对如何将byte[]转换为python字符串感到有点困惑 我在java中有这个字节[] { 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, -
{ 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
位很奇怪。它执行请求的操作,但没有任何用处,因为字节
是有符号的。因此,您需要两个补码,如Martijn答案中的补码,它修复了下一个OP问题:数据有效性:)
如果您在表中有一些ASCII值列表就可以了(并且删除abs
允许我们使用map
,能够使用它是非常罕见的,让我们不要剥夺我们这样做的权利:)
结果:
"ABCD"
假设您使用的是Python3,那么已经可以从列表中初始化字节了。首先需要将有符号整数转换为无符号字节
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)
Java
byte
类型是有符号整数;该值的范围介于-128和127之间。Python的chr
要求值介于0和255之间。从Java教程的第页:
字节:字节数据类型是一个8位有符号2的补码整数。它的最小值为-128,最大值为127(含)
您需要将2s恭维转换为无符号整数:
def twoscomplement_to_unsigned(i):
return i % 256
result = ''.join([chr(twoscomplement_to_unsigned(i)) for i in b])
但是,如果这是Python 3,那么您确实需要使用字节
类型:
result = bytes(map(twoscomplement_to_unsigned, b))
byte
是java中与python ByTestRing不对应的数据类型。虽然您可以从中得到一个结果,但它可能毫无意义。如果这些字节存储在2-补码中,那么您就是在使用abs()销毁信息。有关将单个Pythonint
转换为str
的最小情况,请参见“”。您在键入b=[118,…]
时已将其转换为Python。您真正的问题可能更像“如何将Python列表转换为字符串?”,或者“如何将许多Python整数转换为字符串?”。第一种可能是str(b)
或repr(b)
;第二个类似于“”。join(str(x)表示b中的x)
。另请参见文档。是否可以更有效地进行映射(lambda x:chr(abs(x)),b)
?我认为这是等效的。但正如你所说,不建议传递负字节的绝对值。@MartijnPieters是的,它没有任何用处。我懂笑话了!对不起,我刚刚复制了有缺陷的代码。fixed@Jean-你以为我是认真的吗?抱歉,我只是在开玩笑:)我只是想提醒你。也可以实现为I%256
(在python中)Martijn我注意到你在加入时在括号内使用了一个列表。因此,这比直接将gencomp传递给加入要快得多,对吗?@Jean-Françoisfare:see;对于str.join()
传递列表更快。我已经偶然发现了它,因此提出了我的问题。“少符号多字母”就这样了。很多人会建议删除它们,但是join
无论如何都会创建列表,只是速度较慢。顺便说一句,”的性能问题肯定是相同的。那么加入(映射(chr,items))
?这个map
函数现在真的没用了。@Jean-Françoisfab:是的,map()
在这里也有同样的问题。
result = bytes(map(twoscomplement_to_unsigned, b))