如何将无符号整数(u16)转换为字符串值(char *)?

5

我需要将u16(无符号2字节整数)转换为字符串(非ASCII码)。 如何将无符号整数(u16)转换为字符串值(char *)?


我想用C语言写这个。 - Sujatha
8
如果您不想使用ASCII编码,您希望字符串使用哪种编码? - CB Bailey
2
你对字符串有什么问题吗?不能使用sprintf吗? - Giuseppe Pes
抱歉如果这很愚蠢。sprintf只能将无符号整数转换为字符串,否则它会一次性转换并打印输出吗? - Sujatha
sprintf只能将无符号整型转换为字符串。如果你想将它打印到标准输出,使用printf代替:printf("%u", u16_value); - Mali
显示剩余3条评论
4个回答

9
/* The max value of a uint16_t is 65k, which is 5 chars */
#ifdef  WE_REALLY_WANT_A_POINTER
char *buf = malloc (6);
#else
char buf[6];
#endif

sprintf (buf, "%u", my_uint16);

#ifdef WE_REALLY_WANT_A_POINTER
free (buf);
#endif

更新:如果我们不想将数字转换为文本,而是要转换成实际字符串(由于某些原因,这似乎违背了我对常识的理解),只需要简单地执行以下操作即可:
char *str = (char *) (intptr_t) my_uint16;

或者,如果您需要获取位于同一地址的字符串:

char *str = (char *) &my_uint16;

更新:为了完整起见,另一种展示uint16_t的方式是将其表示为四个十六进制数字的序列,需要4个字符。跳过WE_REALLY_WANT_A_POINTER的繁琐过程,这里是代码:
const char hex[] = "0123456789abcdef";
char buf[4];
buf[0] = hex[my_uint16 & f];
buf[1] = hex[(my_uint16 >> 4) & f];
buf[2] = hex[(my_uint16 >> 8) & f];
buf[3] = hex[my_uint16 >> 12];

这将其转换为文本,这不是OP想要的(我认为这就是OP所说的“非ASCII”)。 - dreamlax
看起来是这样的。访问对象的字节表示(用于二进制序列化等)是很常见的。 - dreamlax
这也包含在内。 - Nerius

3

uint16_t 是一个无符号 16 位整数,只需要两个 unsigned char 对象来表示。高位字节先传还是低位字节先传取决于您的平台的 字节序(Endianness):

// if your platform is big-endian
uint16_t value = 0x0A0B;
unsigned char buf[2];

buf[0] = (value >> 8); // 0x0A comes first
buf[1] = value;


// if your platform is little-endian
uint16_t value = 0x0A0B;
unsigned char buf[2];

buf[0] = value;
buf[1] = (value >> 8); // 0x0A comes last

一个uint16_t中有多少个字符也取决于您的平台(这是一个在拥有16位字符的平台上工作了N年的人说的)。 - Vicky
只有在使用C99标准库stdint.h时才适用。这并不意味着非C99实现不能提供名为uint16_t的16位类型! - Vicky
1
不,你说得很对。POSIX系统确实要求CHAR_BIT==8,并且保留了以_t结尾的类型名称的使用,但是没有迹象表明OP正在使用POSIX系统。 - dreamlax

1
您可以使用 sprintf:
sprintf(str, "%u", a); //a is your number ,str will contain your number as string

1

我不完全清楚你想要做什么,但听起来你需要的是一个简单的转换。

uint16_t val = 0xABCD;
char* string = (char*) &val;

请注意,一般情况下字符串不是以0字节结尾的C字符串,因此不要对其进行任何危险操作。


他想要将"to"转换为"cast"。 - user2110287
1
就像我说的那样,我并没有觉得很清楚。我认为我的问题解释是完全合理的,尽管可能不正确。 - Henrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接