如何根据十六进制值测试字节?
Posted
技术标签:
【中文标题】如何根据十六进制值测试字节?【英文标题】:How to test a byte against a hex value? 【发布时间】:2010-12-19 03:46:07 【问题描述】:我想测试我从数据文件中读取的字节是否为0xEE,我该怎么办?我试过if (aChar == 0xEE)
,但似乎没有用。
【问题讨论】:
这正是您根据十六进制值测试 char 或任何其他数字类型的方式。什么不工作?贴一些源代码。 aChar 的类型是什么?是指针吗? 【参考方案1】:读取有符号字符时,该值永远不会是 0xEE。即:
#include <stdio.h>
int main()
char c = 0xEE; // assumes your implementation defines char as signed char
// c is now -18
if (c == 0xEE)
printf("Char c is 0xEE");
else
printf("Char c is NOT 0xEE");
输出将是
Char c is NOT 0xEE
读取带符号的字符时,该值的范围为 -0x7F 到 0x80。 unsigned char 被解释为从 0x00 到 0xFF,通常是您想要的“原始”字节。
变化:
char aChar;
到
unsigned char aChar;
它应该可以工作。
【讨论】:
需要注意的是,一个普通的旧字符既可以是有符号的,也可以是无符号的;这取决于实施。 @Martin 这是完整的语义。我知道你可以给它分配 0xFF,但是如果一个有符号字符是 0xFF 的测试总是会失败。 重申一下 James McNellis,您的示例是否有效取决于实现。 @Doug T:为什么总是失败?如果 0xEE 不能用 char 表示,那么无论如何它都会被转换为等效的负值,然后它可能会与 char 比较。 @jalf:如果char
是有符号类型,那么char c = 0xEE;
会导致c
为负值(-18)并且测试c == 0xEE
将始终失败。由于十六进制整数文字0xEE
的类型为int
,因此char
将被提升为int
以进行比较。 -18 != 238
.【参考方案2】:
使用字符常量将避免任何实现定义的有符号/无符号字符类型问题:
if( aChar == '\xee' )
【讨论】:
以上是关于如何根据十六进制值测试字节?的主要内容,如果未能解决你的问题,请参考以下文章