簡體   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