2016-12-03 115 views
1

我知道Java和Python手柄字節不同,所以我有點困惑如何轉換字節[]以Python字符串 我有這樣的byte []在java中如何將java byte []轉換爲python字符串?

{ 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)) 

但我真的不知道,如果這是這樣做的正確方法。

+1

'字節'是java中的數據類型,它不對應於python字節串。雖然你可以從中得到結果,但這可能沒有意義。 –

+3

如果這些字節存儲在二進制補碼,那麼你是通過使用abs() – fafl

+0

破壞信息請參閱「[在Python中整數轉換爲字符串?](https://stackoverflow.com/questions/961632)」爲最小將單個Python'int'轉換爲'str'的情況。 –

回答

2

Java的byte類型是符號整數;值的範圍在-128到127之間。Python的chr預期值介於0到255之間。從Java教程的Primitive Data Types section

字節:字節的數據類型是一個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)) 
+1

也可以實現爲'i%256'(在Python中) –

+0

@AnthonySottile:好多主意,謝謝。 –

+0

Martijn我注意到你在加入時使用括號內的列表。所以它比直接將gencomp傳遞給'join'權更快? –

2

字符串串聯效率非常低。

我建議你做,在使用空分離器,以便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" 
+0

執行map(lambda x:chr(abs(x)),b)''會更有效嗎? –

+0

我認爲它是相同的。但正如你所說,不建議傳遞負值字節的絕對值。 –

+0

你不能只在這些字節值上使用'abs()'... –

1

假設你使用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) 
+0

將此數據解碼爲UTF-8將失敗。 –

+0

@MartijnPieters是的,我最初假設他們真的打算使用'abs',它在那裏是有效的,但是無稽之談。 – davidism

相關問題