Как я могу преобразовать целое число в строку Unicode в C? - PullRequest
5 голосов
/ 04 марта 2010

Я работаю над прошивкой для встроенного проекта 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?

Ответы [ 5 ]

5 голосов
/ 04 марта 2010

Кажется, что вы хотите:

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

(при условии, что ваш серийный номер соответствует 32-разрядному целому числу. В любом случае wsprintf напечатает ваш серийный номер в виде строки wchar (unicode).

4 голосов
/ 04 марта 2010

Вы должны быть в состоянии использовать что-то вроде этого:

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 голосов
/ 05 марта 2010

Если у вас есть доступ к 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++);
}
2 голосов
/ 04 марта 2010

Если серийный номер умещается в 32 бита, а платформа с прямым порядком байтов и поддерживает Unicode, 32-битные целочисленные значения и стандартные библиотеки C, то это довольно просто, как показали другие ответы. Если платформа имеет 32-битные целые и 8-битные символы, но имеет младший порядок и / или не поддерживает Юникод, и если серийный номер может различаться по длине, то ниже может быть полезным, хотя это немного по-производственному.

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;
    }
}
2 голосов
/ 04 марта 2010

не уверен, что этот код подойдет для вашего устройства, но давайте попробуем

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