PIC*_*ain 5 c unicode serial-number character-encoding
我正在研究嵌入式USB项目的固件.我想使用的生产程序员自动将序列号写入指定存储器地址的设备闪存中.程序员将序列号存储为指定字节数的十六进制数字.例如,如果我告诉它将序列号123456存储在地址0x3C00,我的内存如下所示:
0x3C00 - 00
0x3C01 - 01
0x3C02 - E2
0x3C03 - 40
//(123456 in Hex = 1E240)
Run Code Online (Sandbox Code Playgroud)
问题是,当我的主机应用程序从设备读取序列号时,它正在寻找一个unicode char数组.所以我的序列号应该是......
{ '1','0',
'2','0',
'3','0',
'4','0',
'5','0',
'6','0'}
Run Code Online (Sandbox Code Playgroud)
当...的时候
所以在我用C编写的固件中,是否可以从flash中检索十六进制序列号,将其编码为unicode char数组并将其存储在Ram中的变量中?
似乎您想要:
wsprintf(wchar_buffer, L"%d", serial_number)
Run Code Online (Sandbox Code Playgroud)
(假设您的序列号适合32位整数。在任何情况下,wsprintf都将您的序列号打印为wchar(unicode)字符串。
如果序列号适合 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;
}
}
Run Code Online (Sandbox Code Playgroud)