从ini文件中读取十六进制字符

Read hex characters from an ini file

本文关键字:十六进制 字符 读取 ini 文件      更新时间:2023-10-16

我有一个包含一些十六进制字符的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不存在(我使用的是borlandc++builder6)。

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

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,这是未定义的行为。更改为:对于(int i=0;i<3;i++)

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

解决方案:

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));
}

由于您使用的是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);
}