将带符号的 Int 转换为带空格的十六进制字符串

Posted

技术标签:

【中文标题】将带符号的 Int 转换为带空格的十六进制字符串【英文标题】:Convert a signed Int to a hex string with spaces 【发布时间】:2014-12-12 04:58:19 【问题描述】:

我想知道是否可以帮助我将整数转换为十六进制字符串,每个字节之间有一个空格,就像这样-

int val = -2147483648;
char hexval[32];

sprintf(hexval, "%x", val)

Output = 80000000 

如何在每个字节之间添加空格,这样我就会有一个类似 -> 80 00 00 00 的字符串

有没有比 malloc'ing 内存和移动指针更简单的方法?

谢谢!

【问题讨论】:

【参考方案1】:

一个简单的函数:

/**
 * hexstr(char *str, int val);
 * 
 * `str` needs to point to a char array with at least 12 elements.
**/
int hexstr(char *str, int val) 
    return snprintf(str, 12, "%02hhx %02hhx %02hhx %02hhx", val >> 24, val >> 16, val >> 8, val);

Example:

int main(void) 
    int val = -2147483648;
    char hexval[12];

    hexstr(hexval, val);
    printf("Integer value: %d\n", val);
    printf("Result string: %s\n", hexval);

    return 0;

整数值:-2147483648 结果字符串:80 00 00 00

【讨论】:

@Gopi 哎呀,我以为我在复制到这里之前已经解决了这个问题,但显然没有。 为什么不在缓冲区中添加空格而不是进行移位操作? 不是动态的,如果val = 1呢?输出将以额外的零作为前缀。 00 00 00 01. 我想太多了,谢谢你带回地球。【参考方案2】:

作为替代方案,您可以考虑使用std::hex。示例:

#include <iostream>

int main() 
    int n=255;
    std::cout << std::hex << n << std::endl;
    return 0;

更新:

不依赖于打印内容的更灵活的实现可以是

void gethex(int n, std::ostream &o) 
    o << std::hex << n;

然后

std::ostringstream ss;
gethex(myNumber, ss);
std::cout << "Hex number: " << ss.str() << std::endl;

【讨论】:

但是,这不会将其存储在字符串中。所以你应该使用stringstream 而不是cout

以上是关于将带符号的 Int 转换为带空格的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为带前导零的十六进制

DAY02

Python格式化字符串(格式化输出)

vc++如何将带小数点的字符串转成数字

如何将十六进制字符串转换为无符号字符数组?

在 Python 中将字符串转换为带小数的整数