2017-07-05 34 views
1

我想用scapy重建數據包。如果我將原始數據包與構建的數據包進行比較,我會發現數據包的一層中有幾個條目的值錯誤。我認爲它來自類似以下一些值不合適的數據類型:數據包層中的錯誤數據類型(scapy)

如果我打印在一個字符串的stream_id這樣

stream_id = "\x00\x22\x97\x04\x06\xba\x00\x00" 

輸出是不可讀(如狂歡的符號)。

但如果我把的stream_id一起自己這樣

alias = "CB" 
stream_id = '\\x' + alias + '\\x' + alias + '\\x' + alias + '\\x' + alias 

打印輸出\ x9B \ x9B \ x9B \ x9B

這兩個符號有什麼區別?

請幫

回答

2

\x<hex_byte>是Python字符串表示文字字節爲十六進制數字一個特殊的轉義序列。

第一個基本上字節寫入你的stream_id,如:

stream_id_1 = "\x00\x22\x97\x04\x06\xba\x00\x00" 
stream_id_2 = chr(0x00) + chr(0x22) + chr(0x97) + chr(0x04) \ 
       + chr(0x06) + chr(0xba) + chr(0x00) + chr(0x00) 

assert stream_id_1 == stream_id_2 # passes 

,如果你打印出字節你:0022970406ba0000

,而第二個是寫一個字符串,彷彿你寫(使用與上述相同的數據):

stream_id_1 = "\\x00\\x22\\x97\\x04\\x06\\xba\\x00\\x00" 

逃避轉義序列,這樣的數字沒有得到解釋爲BYT導致以下打印輸出:5c7830305c7832325c7839375c7830345c7830365c7862615c7830305c783030正如您所見,這是一個截然不同的結構。

UPDATE - 通過將您alias爲整數,然後使用chr()把它變成一個字節字符 - 打造一個字節流,你可以構建它們爲「手動」內置字符串:

alias = chr(int("CB", 16)) 
stream_id = alias + alias + alias + alias # etc. 

但是根據你的評論判斷,你只是想得到一個隨機字節,所以不要通過生成一個十六進制字符串來浪費週期,然後把它變成一個整數,最終將它變成一個字節字符 - 立即獲得一個隨機整數,把它變成字節字符:

alias = chr(random.randint(0, 255)) 
stream_id = alias + alias + alias + alias # etc. 

甚至更​​好,放棄random模塊,並使用os.urandom()來代替:

import os 

alias = os.urandom(1) 
stream_id = alias + alias + alias + alias # etc. 

當然,你也可以使用同樣的技術,只要你喜歡,以獲得儘可能多的不同的隨機字節。

+0

感謝您的回覆。 我想寫字節到我的stream_id變量,但不是像這樣修正** stream_id_1 =「\ x00 \ x22 \ x97 \ x04 \ x06 \ xba \ x00 \ x00」**。 我想將stream_id變量中的數字放在一起,就像這樣**(1)alias =(''。join(random.choice(string.hexdigits)for _ in range(2)))(2)stream_id = ... + alias + ... + alias + ... + alias + ... + alias ** – crappidy

+0

@crappidy - 查看 – zwer

+0

以上的更新,謝謝,現在有用! :)) – crappidy