【问题标题】:How to test a byte against a hex value?如何根据十六进制值测试字节?
【发布时间】:2010-12-19 03:46:07
【问题描述】:

我想测试我从数据文件中读取的字节是否为0xEE,我该怎么办?我试过if (aChar == 0xEE),但似乎没有用。

【问题讨论】:

  • 这正是您根据十六进制值测试 char 或任何其他数字类型的方式。什么不工作?贴一些源代码。
  • aChar 的类型是什么?是指针吗?

标签: c++ char hex


【解决方案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' )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 2017-08-23
    • 2015-08-08
    • 2017-09-13
    • 2012-01-04
    • 1970-01-01
    • 2020-11-11
    • 2015-01-14
    相关资源
    最近更新 更多