我正在做一个嵌入式USB项目的固件。我要使用的生产编程器会自动将序列号写入设备闪存中指定的存储地址。程序员将序列号存储为指定字节数的十六进制数字。例如,如果我告诉它将序列号123456存储在地址0x3C00,我的内存如下所示:
0x3C00 - 00
0x3C01 - 01
0x3C02 - E2
0x3C03 - 40
//(123456 in Hex = 1E240)问题是,当我的主机应用程序从设备读取序列号时,它正在查找unicode字符数组。所以我的序列号应该是...
{ '1','0',
'2','0',
'3','0',
'4','0',
'5','0',
'6','0'}当
那么,在我用C语言编写的固件中,是否可以从闪存中检索十六进制序列号,将其编码到unicode字符数组中,并将其存储在Ram中的变量中?
发布于 2010-03-05 04:57:36
如果序列号适合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;
}
}发布于 2010-03-05 03:30:05
看起来你想要:
wsprintf(wchar_buffer, L"%d", serial_number)(假设您的序列号适合32位整数。在任何情况下,wsprintf都会将您的序列号打印为wchar (unicode)字符串。
发布于 2010-03-05 03:29:06
您应该能够使用下面这样的内容:
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);https://stackoverflow.com/questions/2382090
复制相似问题