如何根据十六进制值测试字节?

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' )

【讨论】:

以上是关于如何根据十六进制值测试字节?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中显示十六进制/字节值

使用 MMX 指令添加压缩字节/字

如何将 8 字节十六进制枚举值添加到无符号字符指针?

读取 uart 十六进制值会忽略某些字节/字符

如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?

如何在Java中将字节数组转换为十六进制格式