从文件读取十六进制数据

时间:2010-04-29 06:04:28

标签: c++ c

我正在尝试从txt文件中读取hexa数据(颜色值为0xffffffffff)...

但我不知道如何阅读....

我声明颜色值像'uint color',我想通过txt文件更改值。

如果我使用int数据我可以使用'atoi'函数,但是我可以使用uint函数吗?

4 个答案:

答案 0 :(得分:2)

您可以使用strtoul

strtoul实际上会返回一个长整数,因此您可以执行以下两项操作之一:

  1. 只是截断数据
  2. 检查它是否适合单位
  3. 示例用法:

    char *endptr;
    unsigned long ul = strtoul(str, &endptr, 16);
    if (str == endptr)
        // error, no data was converted
    
    // just truncate
    unsigned int utrunc = (unsigned int)ul;   
    
    // or you can first check if it fits
    if (ul < UINT_MAX)
        unsigned int ufit = (unsigned int)ul;  
    

答案 1 :(得分:1)

您可以直接从文件中读取十六进制数字:

unsigned int n;
fscanf(fd,"%x",&n);

答案 2 :(得分:1)

在C ++中,您可以将hex操纵器与std::istream一起使用:

unsigned int Read_Value(std::istream& input)
{
    unsigned int value;
    input >> hex >> value;
    return value;
}

答案 3 :(得分:0)

如果您不喜欢我的前任发布的漂亮的自动化方法,您可以随时手动执行此操作...

 const char _hex[] =    
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\x00\x00\x00\x00\x00"
                "\x00\x0A\x0B\x0C\x0D\x0E\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x0A\x0B\x0C\x0D\x0E\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";

 int color;
 char color_txt[6]="DD1173";

 color = _hex[color_txt[5]]
       + _hex[color_txt[4]]<<4
       + _hex[color_txt[3]]<<8
       + _hex[color_txt[2]]<<12
       + _hex[color_txt[1]]<<16
       + _hex[color_txt[0]]<<20;

当然有更优雅的方法 - 在函数中使用条件来将十六进制char转换为int,循环遍历值等等。