簡體   English   中英

將字節中的數據與十六進制數進行比較

[英]Compare data in bytes to a hex number

我需要從標准輸入讀取數據,我需要檢查 2 個字節是否等於 0x001 或 0x002,然后根據值執行兩種類型的代碼之一。 這是我嘗試過的:

uint16_t type;
uint16_t type1 = 0x0001;
while( ( read(0, &type, sizeof(type)) ) > 0 ) {
  if (type == type1) {
   //do smth
  }
}

我不確定讀取使用什么數字系統,因為將類型的值打印為十進制和十六進制都會返回完全不同的東西,即使我在標准輸入上寫入 0001

字符 0x0001 和 0x0002 是 UTF-8 中的控制字符,您將無法手動鍵入它們。

如果您嘗試比較字符輸入 - 使用getsatoi將基於字符的stdin轉換為 integer,或者如果您想繼續使用 read - 比較字符'0' '0' '0' '1'/'2'而不是得到正確結果的值

您沒有說您使用的是哪種操作系統。 如果您在命令行使用 Unix 或 Linux 或 MacOS,則可以很容易地使用簡單的方法來測試此類程序。 但是,如果您使用的是 Windows,很抱歉,我在這里的回答不會很有用。

(我還將大量使用 Unix/Linux 的“管道”概念,即豎線|它將一個程序的 output 發送到下一個程序的輸入。如果你不熟悉這個概念,我的回答一開始可能沒有多大意義。)

如果是我,在將你的程序編譯為a.out之后,我會運行

echo 00 00  00 01  00 02 | unhex | a.out

實際上,我確實將您的程序編譯為a.out ,並嘗試了這個,然后......它沒有用。 它不起作用,因為我的機器(就像你的機器一樣)使用 little-endian 字節順序,所以我應該做的是

echo 00 00  01 00  02 00 | unhex | a.out

現在它完美地工作了。

唯一的問題是,如果您嘗試過,就會發現unhex不是標准程序。 它是我個人 bin 目錄中的一個小實用程序。 它非常方便,如果類似的東西是標准的,它會非常有用,但事實並非如此。 (可能有一個半標准的 Linux 實用程序來做這種事情,但我不知道它是什么。)

一個非常標准的並且您可能可以使用它的是 base-64 解碼器。 那里的問題是沒有很好的方法來手動生成您需要的輸入。 但我可以為你生成它(使用我的 unhexer)。 如果你能跑

echo AAABAAIA | base64 -d | a.out

這將對您的程序執行等效測試。 AAABAAIA是三個 16 位 little-endian 字 0000 0001 和 0002 的 base-64 編碼,您可以通過運行看到

echo AAABAAIA | base64 -d | od -h

在某些系統上, base64命令使用-D選項而不是-d來請求解碼。 也就是說,如果你收到類似“invalid option --d”這樣的錯誤信息,你可以試試

echo AAABAAIA | base64 -D | a.out

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM