我有这个代码:
#include <iostream>
#include <cstdlib>
#include <stdio.h>
int main()
{
std::string napis = "Inhibitor";
int length = napis.length();
char hex[256];
std::cout << "Original: " << napis << 'n';
for (int i = 0; i < length; i++)
{
char buffer[2];
itoa(napis[i], buffer, 16);
hex[2*i] = buffer[0];
hex[2*i+1] = buffer[1];
}
for (int i = 0; i < length * 2 + 1; i++)
{
std::cout << hex[i];
}
}
经过所有这些运算,我得到了hex[0]==0。真的不知道为什么。我想我不会在任何地方设置这个值。程序应该将字符串编码为十六进制。
itoa
函数将向缓冲区写入一个终止nul字符。在您的代码中,它将写入2或3个字符(取决于字符串中字符的ASCII值(,这可能超过数组边界。
解决方案是将buffer
的大小增加至少1:
char buffer[4];
更好的方法是使用不推荐使用的名称(_itoa
(,在带有字符数组的C++中,它将调用检测缓冲区溢出的函数的安全版本(_itoa_s
(。
只需避开临时缓冲区,直接在结果缓冲区中写入即可。
char str[] {"abcdefg"};
char hex[256];
for (uint i {0}; i < sizeof(str) - 1; ++i) {
::sprintf (&hex[i*2], "%02X", str[i]);
}
std::cout << "Hex: " << hex << std::endl;