2011-11-02 23 views
8

Örneğin, 2 bayt değerinin 'ters' bayt düzeninde (küçük endian?) Depolandığı bir ikili dosyam var.İkili verinin bayt sırası nasıl değiştirilir

1D 00 13 00 27 00 3B 00 45 00 31 00 4F 

Bu değerleri oluşturan orijinal program, bunları dahili olarak şort olarak depolar. Bu değerler aşağıdakilere karşılık gelmelidir: 29, 19, 39, 59, 69, 49, 79. Bu değerleri python 2.6.5 kullanarak okumaya çalışıyorum (bu muhtemelen daha eski sistemlerde çalışacaktır, örneğin 2.3 ve 2.4) .

Ben

val1, val2, val3, val4, val5, val6, val7 = struct.unpack("1h 1h 1h 1h 1h 1h 1h", data) 

kullanarak denedim ve tabii ki değerler tüm yanlış çıkarlar:

7427 
4864 
9984 
15104 
17664 
12544 
20224 

yapı belgelerine baktıktan sonra ben mümkün olacağını düşünmüştüm

val1, ... = struct.unpack("!h !h ... 

ama böyle bir şey kullanmak test, sadece

var
struct.error: bad char in struct format 

Bu değerleri doğru bayt sıralamasıyla nasıl açabilirim? İki bayttan ayrı olarak okumaya devam ettim mi python kodunda onları yeniden birleştiriyordum?

cevap

9

Bayt sırası, biçim dizesinin başında tek bir karakterle belirtilir.

values = struct.unpack('!7h', data) 
+0

Aha, buydu. Biçim dizisinde birkaç biçim belirleyicim var, ancak yalnızca tüm dizenin başlangıcında yerine "h" belirticinin önüne bayt sırası char yerleştirildi. Teşekkürler! – pfyon

3

Nasıl

>>> struct.unpack('<%dH' % (len(a)/2), a)

(29, 19, 39, 59, 69, 49, 79)>>> a='\x1d\x00\x13\x00\x27\x00\x3b\x00\x45\x00\x31\x00\x4f\x00'

hakkında?

struct belgelerine göre, küçük-endian belirtmek için < kullanmanız gerekiyor gibi görünüyor.

0

a.byteswap(True) kullanarak, ters bayt sırası ile benzer bir sorun çözdüm, ancak bunun en etkili yöntem olup olmadığından emin değilim.

İlgili konular