[英]How can I convert an integer into a Unicode string in C?
我正在研究嵌入式USB项目的固件。 我想使用的生产程序员自动将序列号写入指定存储器地址的设备闪存中。 程序员将序列号存储为指定字节数的十六进制数字。 例如,如果我告诉它将序列号123456存储在地址0x3C00,我的内存如下所示:
0x3C00 - 00
0x3C01 - 01
0x3C02 - E2
0x3C03 - 40
//(123456 in Hex = 1E240)
问题是,当我的主机应用程序从设备读取序列号时,它正在寻找一个unicode char数组。 所以我的序列号应该是......
{ '1','0',
'2','0',
'3','0',
'4','0',
'5','0',
'6','0'}
当。。。的时候
所以在我用C编写的固件中,是否可以从flash中检索十六进制序列号,将其编码为unicode char数组并将其存储在Ram中的变量中?
看起来你想要:
wsprintf(wchar_buffer, L"%d", serial_number)
(假设您的序列号适合32位整数。在任何情况下, wsprintf
都会将您的序列号打印为wchar(unicode)字符串。
你应该可以使用这样的东西:
wchar_t buf[10];
swprintf(buf, L"%d", your_int_value);
细节可能会有所不同,具体取决于C运行时库的确切实现。 例如,您的swprintf()
可能需要buf
的字符数:
swprintf(buf, sizeof(buf)/sizeof(buf[0]), L"%d", your_int_value);
不确定此代码是否适合您的设备,但我们试试吧
char buffer[MAX_SIZE];
char unicodeBuffer[MAX_SIZE];
sprintf(buffer, "%d", i);
int len = strlen(buffer);
int i = 0;
for (int i = 0; i <= (len << 1) - 2; i++)
unicodeBuffer[i] = i % 2 ? buffer[i] : 0;
unicodeBuffer[i + 1] = 0;
unicodeBuffer[i + 2] = 0;
如果序列号适合32位并且平台是大端并且支持Unicode,32位整数和标准C库,那么这非常简单,正如其他答案所示。 如果平台有32位整数和8位字符但是小端和/或不支持Unicode,并且如果序列号的长度不同,那么下面的内容可能会有用,尽管它有点像工作。
void extract_serial_number(unsigned char* address, unsigned int bytes, char* buffer) {
unsigned int value = 0;
char c, *start = buffer;
while (bytes--) { /* read the serial number into an integer */
value = value << 8;
value |= *address++;
}
while (value > 0) { /* convert to 16 bit Unicode (reversed) */
*buffer++ = '0' + value % 10;
*buffer++ = '\0';
value /= 10;
}
*buffer++ = '\0';
*buffer++ = '\0';
buffer -= 4;
while (buffer > start) { /* reverse the string */
c = *buffer;
*buffer = *start;
*start = c;
buffer -= 2;
start += 2;
}
}
如果您可以在嵌入式环境中访问sprintf
,那么这应该有效:
#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1) / 3 + 2)
/* Destination UCS2 buffer size must be at least 2*MAX_SIZE(int) */
void int_to_ucs2(char *dest, int q)
{
char buffer[MAX_SIZE(q)];
char *src = buffer;
sprintf(buffer, "%d", q);
do {
*dest++ = *src;
*dest++ = 0;
} while (*src++);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.