C輸出大於127的ACSII字元

2022-04-01 22:21:11 字數 777 閱讀 1200

近期,我們的dns伺服器收到了一些異常的網域名稱請求,從訪問日誌看到很多網域名稱都被返回了format error的錯誤碼,但是訪問日誌中的網域名稱看起來很正常啊,為什麼會返回format error的錯誤碼呢?

經過一系列排查,找到了直接原因。

問題在於我們收到的一些dns訊息包的請求網域名稱中含有值大於127的字元。下面是該非法網域名稱中其中乙個label的十六進製制資料:

0x09, 0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e.

可以看到,中間有乙個0xe1,它的值是225,它在終端上是不可列印的字元。包含這樣的字元的網域名稱會被我們認為是非法的網域名稱,所以返回了formaterror,但是為什麼訪問日誌中看不到這個字元呢?讓我們做個實驗看一下:

#include int main()

; printf("%s\n", s);

return 0;

}

上面的**會列印出什麼呢?理論上它會列印出"taob?ocdn",其中的"?"是那個0xe1在終端輸出的樣子,但是實際上它的輸出是:

taobn

可以看到,輸出時,0xe1以及其後的三個字元都沒有被輸出到終端。所以我們在訪問日誌中看到的是乙個合法的網域名稱。。。。

這裡有對這個問題的詳細討論。

對於不可列印的ascii碼,如果將它們輸出到終端,它們的行為是跟終端的字元編碼有關。所以最保險的方法是,對於不可列印的那些ascii碼,做一下特殊處理,因為如果將它們輸出到終端的話,你看到的不一定是實際的內容。

C輸出大於127的ACSII字元

近期,我們的dns伺服器收到了一些異常的網域名稱請求,從訪問日誌看到很多網域名稱都被返回了format error的錯誤碼,但是訪問日誌中的網域名稱看起來很正常啊,為什麼會返回format error的錯誤碼呢?經過一系列排查,找到了直接原因。問題在於我們收到的一些dns訊息包的請求網域名稱中含有值...

12 7java物件導向之this關鍵字的說明

this關鍵字可以指代那些呢?可以表示操作類的屬性 方法和當前物件。案例 定義乙個類,表示年齡和姓名基本資訊,例項化物件並輸出結果 本程式是對this關鍵字的說明 class info 方法 public void print public class testthis 結果如下 結果沒有任何問題,...

逆序輸出不大於五位的數

include stdio.h int main void if x 0 a x 10000 b x 1000 c x 100 d x 10 e x if a 0 printf 該數為乙個五位數,個位 d,十位 d,百位 d,千位 d,萬位 d.n e,d,c,b,a else if b 0 pri...