【发布时间】:2013-03-14 11:15:05
【问题描述】:
我已经看到了几个将数字从十进制转换为十六进制(或以 10 为底数为 16 进制)的示例,但我对我正在尝试做的事情有一些限制。我需要能够将带有十进制数字的字符串转换为另一个字符串作为十六进制数字。该数字可能太大而无法容纳在任何原始数据类型中 - 即:不能使用整数、无符号整数、双精度数等...
这应该能够执行与此页面上列出的相同的计算。 http://www.kaagaard.dk/service/convert.htm
我试过这个,但对我没有用。
函数调用:
const int maxLen = 256;
char destination[maxLen];
int retVal = convertBase(destination, maxLen, "123487032174829820348320429437483266812812");
函数定义:
int convertBase(char* dest, int maxDestLength, const char* inputInBase10)
{
const char lookUpTable[] = { "0123456789abcdef" };
const std::string input = inputInBase10;
const unsigned int inputSize = input.length();
std::string output;
output.reserve(2 * inputSize);
for(unsigned int i = 0; i < inputSize; ++i)
{
const unsigned char c = input[i];
output.push_back(lookUpTable[c >> 4]);
output.push_back(lookUpTable[c & 15]);
}
if(output.length() < maxDestLength)
strcpy_s(dest, output.length(), output.c_str());
else
strcpy_s(dest, maxDestLength, output.c_str());
cout << dest << endl;
return strlen(dest);
}
预期的十六进制数:“16ae5514d07e120126dfbcb3073fddb2b8c”
生成的实际十六进制数:“313233343837303332313734383239383230333438333230343239343337343833323636383132383132”
另外,当传递回 char* 时,我不断收到一个错误,即缓冲区太小(在下面重复)
if(output.length() < maxDestLength)
strcpy_s(dest, output.length(), output.c_str());
else
strcpy_s(dest, maxDestLength, output.c_str());
【问题讨论】:
-
您正在将输入字符串中数字的 ASCII 值转换为十六进制,而不是输入字符串表示的实际数字。
-
这里有一个提示:你得到的输出 ("313233343837") 看起来像你输入数字字符的 ASCII 值(在字符串中编码为十六进制字节) - 例如0x38 == '8'
-
这种东西一般需要做长除法,但是没有长除法的时候,可以通过一系列的加法来构建。这必须是最优的吗?我有一个非最优但简单的解决方案。
-
最佳方案是首选,但欢迎任何解决方案。
-
嗯,我的回答应该对你有所帮助。顺便说一句,它正确转换了您在示例中提供的号码,而您链接到的号码服务无法处理它。
标签: c++ string algorithm hex decimal