2010-08-18 64 views
3

我有一些二進制數據,在十六進制編輯器,它看起來像: somedata讀40個字節的二進制數據爲ASCII文本的

所有這些點中的每個字母

當我filehandle.read讀之間(40) 它顯示了這些點

我知道點不應該在那裏,有沒有辦法解壓一些40位長的結構的ASCII數據?

我試圖40年代'及「s」,但它示出了怪異數據,或僅解包1個字符,而不是40

+4

十六進制編輯器中的點是0x00嗎?我想知道這是否是UTF-16文本,您可以通過適當的文本轉換來閱讀。 – fadden 2010-08-18 00:03:00

+0

是的,他們是00 – springwater4u 2010-08-18 00:05:02

+4

是的 - 這裏的問題是您正在處理某種非ASCII數據,最有可能是UTF-16。你只會得到一個單一的字符,因爲這些點正被讀爲ASCII NULs(因此終止了字符串)。 – pkh 2010-08-18 00:06:54

回答

1

快速和骯髒的解決方案是使用s[::2]其中s是80個字符字節您想要考慮的字符串只有備用字節。 「clean:s​​olution,per @ fadden的評論可能是將數據讀取爲UTF-16(然後將其.encode轉換爲ASCII等),但如果這樣做足夠滿足您的需要,則可能會更簡單快捷原始數據的字符數爲而不是處於最低的256個範圍內,而Q & D方法會給出奇怪的結果,而正確的結果會引發異常 - 哪種處理更好取決於您的應用程序......)。

+0

快速和骯髒真棒!整齊。 雖然它是UTF-16是有道理的..謝謝兩個:) – springwater4u 2010-08-18 00:18:06

4

如果你的第一個字節然而,它會是一個很好的id ASCII字符(由你的例子所示)和你的第二個字節是「\ X00」,那麼你可能有數據編碼成UTF-16LE。

如果您明確地向我們展示了文件的前幾個字節中的內容,請執行此操作:

python -c "print(repr(open('myfile.txt', 'rb').read(20)))" 

並編輯您的問題以向我們顯示結果。如果任何文字是保密的,請在編輯時保留其意義。

我們特別感興趣的是看它是否以UTF-16 BOM('\xff\xfe''\xfe\xff')開頭。

對於背景,你在哪個平臺上(Windows或Linux)?什麼產生了這個文件?

更新我有點被你的聲明「」不解「我想40年代'和‘S’,但它顯示怪異的數據,或者只解包1個字符,而不是40‘’」檢查下面的例子:

>>> data = "q\x00w\x00" 
>>> unpack("4s", data) 
('q\x00w\x00',) # weird? it's effectively tuple([data]) 
>>> unpack("s", data) 
# doesn't produce a string of length 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
struct.error: unpack requires a string argument of length 1 
>>> unpack("ssss", data) 
('q', '\x00', 'w', '\x00') # this == tuple(data) 
>>> 

@pxh評論說:「」「你只得到一個字符,因爲這些點被讀取爲ASCII完全無效(因此終止字符串)‘’」我很懷疑不管@pxh是否真的可以證明struct.unpack對"s"格式的使用取決於個別字節val在數據中,是否NUL"\x00")或其他。

0

在Python中讀取二進制數據我使用:

val = f.read(1) 
val = struct.unpack('c' , val) 

和閱讀逐字節我所需要的。 對於40字節的結構,我將是

val = f.read(40) 
val = struct.unpack('40c' , val) 
+0

-1首先,OP有一個問題**文本**,而不是二進制數據。其次,'val = struct.unpack('40c',val)'只是寫'tuple(val)'的一個很長的路,而且容易出錯 - 你需要確保長度相同(例如:40 )用於讀取和解壓縮。 – 2010-08-18 22:22:25