C輸出大於127的ACSII字元

來源:互聯網
上載者:User

標籤:blog   http   io   ar   for   sp   資料   div   on   

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

  經過一系列排查,找到了直接原因。
  問題在於我們收到的一些DNS訊息包的請求網域名稱中含有值大於127的字元。下面是該非法網域名稱中其中一個label的十六進位資料:

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

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

#include <stdio.h>int main(){    unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e, ‘\0‘};      printf("%s\n", s);    return 0;}

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

taobn

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

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

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

 

C輸出大於127的ACSII字元

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.