[英]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 中的控制字符,您将无法手动键入它们。
如果您尝试比较字符输入 - 使用gets
和atoi
将基于字符的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.