【问题标题】:Need help on padding hex and some conversions在填充十六进制和一些转换方面需要帮助
【发布时间】: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


【解决方案1】:

使用0 标志(前缀)在printf 中指定零填充和字段宽度:

printf("%032X", x);

使用snprintf 将其存储在您的字符串中:

snprintf(buff, sizeof(buff), "%032X", x);

或者使用asprintf将其存储在一个新分配的字符串中,以确保该字符串可用的内存是足够的(因为它是由asprintf分配的):

char *as_string = NULL;
asprintf(&as_string, "%032X", x);

【讨论】:

  • 谢谢泰德,但那只会打印出来吗?我只是想获得一个新的字符串填充..现在用什么?也很高兴听到您对我在帖子中提到的其他代码部分的看法..
  • 更新了答案以指示用于字符串格式而不是输出的替代 printf-like 函数。特别是如果你想自动拥有一个足够大的缓冲区,你应该使用asprintf() 而不是snprintf()。您仍然需要检查两种情况下的错误(即检查snprintfasprintf 的返回码)。
  • 好的,泰德,在你的情况下 x 是什么 - 它是整数吗?就我而言,我要填充的数字 ffd 存储在字符串中 ...
  • x 是您的 unsigned int x 变量。
  • 谢谢,看来也不需要像我在第二步中所做的那样将 int 转换为 hex..
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
相关资源
最近更新 更多