繁体   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