【问题标题】:Read hexa data from file从文件中读取十六进制数据
【发布时间】:2010-04-29 06:04:28
【问题描述】:

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

但我不知道怎么读....

我将颜色值声明为“uint color”,我想通过 txt 文件更改该值。

如果我使用 int 数据,我可以使用 'atoi' 函数,但是对于 uint,我可以使用什么函数?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    您可以使用strtoul

    strtoul 实际上返回一个 long,所以你可以做以下两件事之一:

    1. 只截断数据
    2. 检查它是否适合一个单元

    示例用法:

    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;  
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          如果您不喜欢我的前辈发布的漂亮的自动化方法,您可以随时手动完成...

           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;
          

          当然还有更优雅的方法——在函数中使用条件将十六进制字符转换为整数、循环值等等。

          【讨论】:

          • 您的解决方案意味着给定的字节序。将值作为文本放入数据文件中会从问题集中移除 Endianess。
          • @Thomas:用乘法(*0x10,*0x100,*0x1000)替换移位,这变得与字节序无关。除了 ascii 文本十六进制字节序,但作为文本写入的数字始终为低字节序。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          • 2016-11-04
          • 2014-02-25
          • 1970-01-01
          • 2015-05-01
          • 2014-02-18
          相关资源
          最近更新 更多