【问题标题】:Read hex characters from an ini file从 ini 文件中读取十六进制字符
【发布时间】:2012-08-23 11:23:49
【问题描述】:

我有一个带有一些十六进制字符的ini文件,像这样:

[FOO]
1=0x55
2=0x40
3=0x90

首先,这是 ini 文件的正确格式,还是应该使用 \x50?

其次,我如何阅读字符?我有这个:

char Frame[4]
TIniFile* IniFile;
IniFile=new TIniFile(cPath+"\\"+"setup.ini");
for( int i = 1; i < 4; i++ )
{
 Frame[i]=IniFile->ReadString("FOO",i,-1); 
}

问题是 IniFile->ReadChar 不存在(我使用的是 borland c++ builder 6)。

如何将字符串(例如 0x55)转换为字符?所以我可以把它放在 Frame 数组中

【问题讨论】:

  • "首先,这是 ini 文件的正确格式,还是应该使用 \x50?" INI 文件没有标准规范,因此您可以这样做,因为它对您的解析器更简单(尽管 0x50 更广泛地用于数字)。

标签: c++ char c++builder ini


【解决方案1】:

\x55 表示法通常在字符串文字中使用:

const char* s = "\x55";

写入文件0x55 很常见,但最终由处理文件的代码知道它正在消耗什么。

我无法评论IniFile,但如果你能设法将值存储到char[] 中,你可以使用std::strtol() 来获取整数值:

const char* s = "0x55";
long value = std::strtol(s, 0, 16);

另外,请注意for 循环超出了数组Frame 的范围,因为数组索引是从零开始的。 Frame 的有效索引是 012,但循环将访问 3,这是未定义的行为。改成: for(int i = 0; i

请注意,for 循环不会填充Frame 的第一个元素,因为数组索引是从零开始的(不确定这是否是故意的)。

【讨论】:

  • 好的,我现在可以像字符串一样读取十六进制值。所以我得到:str="0x55"。我怎样才能使它成为(十六进制)字符? std::strtol(str, 0, 16);不起作用,我做不到:'Frame[i]=std::strtol(str,0,16);。编译器给出函数返回 AnsiString 的错误...
  • @Marty, IniFile-&gt;ReadString 听起来很有希望。
  • @Marty, strtol()not 返回一个字符串,它返回一个long。要将其存储为 char,请将其转换为:static_cast&lt;char&gt;(strtol(....));
【解决方案2】:

解决方案:

AnsiString string;
TIniFile* IniFile;
IniFile=new TIniFile(cPath+"\\"+"setup.ini");
for( int i = 1; i < 5; i++ )
{
 string=IniFile->ReadString("FOO",i,-1);
 Frame[i]=static_cast<char>(std::strtol(string.c_str(), 0, 16));
}

【讨论】:

  • strcpy(str,string.c_str()); 破坏内存
  • Frame[i]=static_cast&lt;char&gt;(std::strtol(string.c_str(), 0, 16)); 怎么样?
【解决方案3】:

由于您使用的是VCL,您可以使用StrToInt...() 系列函数,它支持C++ 中的0xXX 表示法,然后将结果转换为char,例如:

for( int i = 0; i < 4; i++ )
{
    Frame[i] = (char) StrToIntDef(IniFile->ReadString("FOO", i+1, ""), -1);
}

或者:

for( int i = 0; i < 4; i++ )
{
    Frame[i] = (char) IniFile->ReadString("FOO", i+1, "").ToIntDef(-1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2014-02-25
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多