【发布时间】:2010-04-29 06:04:28
【问题描述】:
我正在尝试从 txt 文件中读取 hexa 数据(颜色值 ex. 0xffffffff)...
但我不知道怎么读....
我将颜色值声明为“uint color”,我想通过 txt 文件更改该值。
如果我使用 int 数据,我可以使用 'atoi' 函数,但是对于 uint,我可以使用什么函数?
【问题讨论】:
我正在尝试从 txt 文件中读取 hexa 数据(颜色值 ex. 0xffffffff)...
但我不知道怎么读....
我将颜色值声明为“uint color”,我想通过 txt 文件更改该值。
如果我使用 int 数据,我可以使用 'atoi' 函数,但是对于 uint,我可以使用什么函数?
【问题讨论】:
您可以使用strtoul
strtoul 实际上返回一个 long,所以你可以做以下两件事之一:
示例用法:
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;
【讨论】:
您可以直接从文件中读取十六进制数:
unsigned int n;
fscanf(fd,"%x",&n);
【讨论】:
在 C++ 中,您可以将 hex 操纵器与 std::istream 一起使用:
unsigned int Read_Value(std::istream& input)
{
unsigned int value;
input >> hex >> value;
return value;
}
【讨论】:
如果您不喜欢我的前辈发布的漂亮的自动化方法,您可以随时手动完成...
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;
当然还有更优雅的方法——在函数中使用条件将十六进制字符转换为整数、循环值等等。
【讨论】: