【发布时间】:2013-09-18 21:06:59
【问题描述】:
我将简要说明我想做的事情并感谢您的帮助。
我有一个十六进制数,格式为 16 字节数,如下所示:
1: std::string myhex = "00000000000000000000000000000FFD";
然后我想将它转换为 int。我认为我成功地使用了这个:
// convert hex to int
unsigned int x = strtoul(myhex.c_str(), NULL, 16);
printf("x = %d\n", x); // prints 4093 as needed
现在,我想将此整数转换回十六进制。我认为我也成功地使用了这个:
// Convert int back to hex
char buff[50];
string hexval;
sprintf(buff,"%x",x);
hexval = buff;
cout << hexval.c_str(); // prints "ffd".
但我的问题是,现在我想将上面的“ffd”字符串转换回以前的格式,例如,用零填充的 16 字节数字:
00000000000000000000000000000FFD
我想转换字符串不只是打印它。
任何帮助如何做到这一点? 如果我在上面实现的任何内容是错误的或不正确的,也欢迎任何更正。 最好我也希望它在 Linux 上编译。
【问题讨论】:
-
所以您的问题不是关于转换,而是关于如何将包含整数的十六进制表示形式的字符串格式化为具有前导零?您是否阅读过
sprintf文档?请尽量使您的问题简洁明了,不那么开放。 “我希望它也能在 Linux 上编译” 看起来很奇怪,因为在此之前你从未提到过你使用的是 Windows。祝你好运! -
很不清楚为什么你坚持用十六进制编码 16 字节的值,并认为使用只能 4 或 8 字节的转换函数是可以接受的。您正在追求垃圾中的垃圾谬误。与显示超过 15 个数字的双精度数相同的谬误。右边那些多余的数字没有任何意义。就像在您的情况下左侧的那些额外零没有任何意义一样。所以不要费心展示它们。让您的用户休息一下。
-
Hans 是对的——
unsigned long对这项任务来说不够大,所以很遗憾,您对strtoul的使用不正确。 -
@HansPassant:这不适合用户。我必须存储这个变量的地方只接受 16 个字节。此外,我认为存储在
myhex中的数字不会很大,例如超过 4 个字节。在这种情况下你怎么看? -
@LightnessRacesinOrbit:请看我上面的评论
标签: c++ c string hex string-formatting