2011-09-26 50 views
21

Ham ikili veriler içeren bir tcp çerçeve oluşturmam gerekiyor, ancak baytlar hakkında konuştuğum tüm örnekler ve eğiticiler her zaman bir dizeden dönüştürme içeriyor ve buna ihtiyacım yok. Kısacası Python 3 Bayt dizisi oluşturma

, sadece bir bayt dizisi oluşturmak gerekir: 0xA2 0x01 0x02 0x03 0x04

C/C++ Dünya geldiğini unutmayınız.

Bu denedim: İstediğimi içermiyor çerçeve olarak beklendiği gibi ... Sonra

frame = b"" 
frame += bytes(int('0xA2',16)) 
frame += bytes(int('0x01',16)) 
frame += bytes(int('0x02',16)) 
frame += bytes(int('0x03',16)) 
frame += bytes(int('0x04',16)) 

, soket yöntemini göndermek için bu çerçeve değişkeni atmak, ancak çalışmıyor

Bu Python hakkında çok basit bir soru olduğunu biliyorum, bu yüzden bana doğru yönde bana işaret edebilirseniz ...

+3

Yukarıdaki kodla ilgili sorun, bir liste yerine bir tamsayı verilirse, baytların çok farklı davranmasıdır. Frame + = bayt ([int ('0xa2', 16)]) 'kullanmalısınız. –

+0

Bunu dinamik olarak yapmak istediğinizi biliyorum (ed), ancak tamamen belirsiz olan şey şudur: giriş baytları nereden geliyor? Metin dosyasından onaltılık notasyon okuyor musunuz? Her baytı aşağı kaynak koduna yazarsınız? Onları stdin'den ikili okumadan aldığın bir arkadaşın var mı? –

cevap

27

Kullanımına kare (paketleri) gönderebileceğiniz bir bytearray:

>>> frame = bytearray() 
>>> frame.append(0xA2) 
>>> frame.append(0x01) 
>>> frame.append(0x02) 
>>> frame.append(0x03) 
>>> frame.append(0x04) 
>>> frame 
bytearray(b'\xa2\x01\x02\x03\x04') 

ya da kodunu kullanarak ancak sabitleme hataları:

frame = b"" 
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03' 
frame += b'\x04' 
+0

etiketi, cevabın çözüm olarak kullanamayacağı bir soruya, bytearray etiketini eklediniz. –

+0

@clinisbut Hala ilgili - genel anlamda bytearray türünü kullanmıyor olsanız bile bir bayt dizisi (kavram) kullanıyorsunuz. Cevabımdaki iki yöntemden herhangi biri probleminizi çözmelidir. – agf

+0

"bytearray" bytes 'ile değiştirebilir ve kabaca aynı sonucu alabilirsiniz. bir “bytearray” ise değiştirilebilir bir türdür, bu yüzden çerçevelerinizi oluşturmak için bir “bytes” den daha kullanışlı olabilir. –

0

Bence Scapy ne arıyorsun.

http://www.secdev.org/projects/scapy/

inşa ve

+1

Teşekkür ederim, ama nasıl yapılacağını öğrenmekle ilgileniyorum;) –

+0

Genel olarak, scapy genel ağ ve paket projeleri için iyi bir araçtır. Bence aradığınız şey şunun gibi: > >>> struct import * > >>>>>> packet = pack ('Bbbbb', 162,1,2,3,4,) > >>> paket > '\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

Bana inanmayın, sorunumu python ile çözmek istiyorum. –

10

Sadece çerçevenizi bir staktan inşa etme Ndard listesi?

frame = bytes([0xA2,0x01,0x02,0x03,0x04]) 

bytes() yapıcı int değerleri içeren bir iterable bir bayt çerçeve oluşturabilir. bir iterable yineleyici protokolünü uygulayan bir şey: ... Bir liste, liste, range() tarafından döndürülen ne gibi bir iterable nesne

6
frame = b'\xa2\x01\x02\x03\x04' 

... şu ana kadar

+0

ancak çerçeveyi dinamik olarak oluşturmak için bu sözdizimini –

+1

bir bayt dizisi ile aynı işlevin bir dizini oluşturmak için kullanmanız gerekir: bayt dizisini dinamik olarak oluşturmak için '+' veya diğer benzer operatörleri kullanabilirsiniz. –