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