Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java字节[]转换为python字符串?_Java_Python_String - Fatal编程技术网

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

如何将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, -

我知道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, -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()销毁信息。有关将单个Python
int
转换为
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))