在Visual Studio2010上使用C++。
尝试提出一个健壮的函数,该函数将十六进制值作为字符串,将大小作为整数,然后输出格式化的十六进制值。
例如,
如果输入字符串为"A2“且大小为1,则输出为"0xA2”
如果输入字符串为"800“,大小为2,则输出为"0x0800”
如果输入字符串为"DEF“且大小为4,则输出为"0x00000DEF”
如果输入字符串为"00775“,大小为4,则输出为"0x00000775”
如果输入字符串为"FB600“,大小为3,则输出为"0x0FB600”
基本思想是,将大小乘以2,如果字符串长度小于2,则将前导零添加到十六进制值,然后将其附加"0x“。
无论是否添加了前导零,都会追加"0x“。
正如你在第一个例子中看到的,没有要添加的零,因为字符串已经包含了2个字符。
我想出了下面的函数,但它有内存损坏。此外,当我试图通过调用这个函数来处理大量数据时,它会崩溃。似乎我的逻辑中有内存漏洞。
所以我希望有人能想出一个健壮的智能代码来实现这个功能。
我尝试过的东西:
void formatHexString(char* inputHex, int size, char* outputFormattedHex)
{
int len = size * 2;
int diff = len - strlen(inputHex);
char * tempHex = new char [diff + 2]; //"2" is for holding "0x"
tempHex[0] = '0';
tempHex[1] = 'x';
if (len > strlen(inputHex))
{
for (int i = 2; i < ((len - strlen(inputHex)) + 2); i++)
{
tempHex[i] = '0';
}
}
strcat(tempHex, inputHex);
sprintf(outputFormattedHex, "%s", tempHex);
delete [] tempHex;
cout <<outputFormattedHex <<endl;
}
int main
{
char bbb1[24];
formatHexString("23", 1, bbb1);
char bbb2[24];
formatHexString("A3", 2, bbb2);
char bbb3[24];
formatHexString("0AA23", 4, bbb3);
char bbb4[24];
formatHexString("7723", 4, bbb4);
char bbb5[24];
formatHexString("AA023", 4, bbb5);
return 0;
}
更新:
我无法修改原始函数的参数,因为此函数是从不同的应用程序调用的。所以我用你的代码修改了我的原始函数,但这不起作用。有什么想法吗?
void formatHexString(char* inputHex, int size, char* outputFormattedHex)
{
string input(inputHex);
std::size_t const input_len(input.length());
if (!size || (size * 2 < input_len))
size = input_len / 2 + input_len % 2;
std::stringstream ss;
ss << "0x" << std::setw(2 * size) << std::setfill('0') << input;
sprintf(outputFormattedHex, "%s", ss.str());
}
https://stackoverflow.com/questions/51528751
复制相似问题