如何在C中将整数转换为Unicode字符串?

时间:2010-03-04 19:23:39

标签: c unicode character-encoding serial-number

我正在开发嵌入式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中的变量中?

5 个答案:

答案 0 :(得分:5)

好像你想要:

wsprintf(wchar_buffer, L"%d", serial_number)

(假设您的序列号适合32位整数。在任何情况下,wsprintf都会将您的序列号打印为wchar(unicode)字符串。

答案 1 :(得分:4)

你应该能够使用这样的东西:

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);

答案 2 :(得分:2)

不确定此代码是否适合您的设备,但让我们试试

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;

答案 3 :(得分:2)

如果序列号适合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;
    }
}

答案 4 :(得分: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++);
}