Я работаю над Встроенным микропрограммным обеспечением для встроенного проекта 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?
Если серийный номер умещается в 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;
}
}
не уверен, что этот код подойдет для вашего устройства, но давайте попробуем
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;
Вы должны иметь возможность использовать что-то вроде этого:
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);
Похоже, что вы хотите:
wsprintf(wchar_buffer, L"%d", serial_number)
(предполагая, что ваш серийный номер помещается в 32-битное целое число. В любом случае, wsprintf
выведет ваш серийный номер в виде строки wchar (unicode).
Если у вас есть доступ к 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++);
}