Как преобразовать массив (char), содержащий 8 байтов (которые представляют 64-битное целое число) в строку
Как написано в заголовке, мне нужно преобразовать массив (char), содержащий 8 байтов (которые представляют 64-битное целое число), в строку. Я использую код C на NEC78K0R (16 бит Mcu). Я использую интегрированную среду разработки IAR.
Я думал о том, чтобы ИЛИ их вместе в 64-битном типе int (например, fx long long или int64_t (из stdint.h)), а затем использовать что-то вроде sprintf для преобразования его в строку.
Однако компилятор начнет выплевывать ошибки типа "тип long long не существует". Каждый раз, когда я использую любой из стандартных 64-битных целочисленных типов.
Любая помощь будет высоко ценится.
3 ответа
Если массив char ссылается на блок памяти из 8 байтов, который на самом деле является истинным 64-разрядным целым числом, и ваш компилятор поддерживает int64_t
Можно просто разыграть и разыменовать.
int64_t convert(const char* input)
{
return *((int64_t*)input);
}
Если платформа поддерживает 64-битные типы данных, sprintf
также будет поддерживать его с %L
спецификатор формата.
Если ваши компиляции не поддерживают какие - либо 64-битные типы данных, вам нужно использовать специальную библиотеку для их обработки, например BigInt или GMPlib.
Вы не указали кодировку строки, которая вам понадобится. Самым простым будет, вероятно, использовать шестнадцатеричное кодирование и просто печатать байты напрямую.
printf("0x%02x%02x%02x%02x%02x%02x%02x%02x", a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]);
Чтобы сделать это немного более эффективным, если это является для вас узким местом, вы можете просто сгруппировать максимальные части, которые поддерживает ваша платформа, приведя его к unsigned long
Например, будьте осторожны, если ваш char
массив выполняет необходимое выравнивание для интерпретации как таковой unsigned long
, Если вы не можете гарантировать это, вы должны сначала использовать memcpy
скопировать данные в правильно выровненный объект.
unsigned long b[2];
memcpy(b, a, sizeof b);
printf("0x%08x%08x", b[1], b[0]);
(если предположить, что unsigned long
4 байта)
Если long
соответствующий 32-битный целочисленный тип и шестнадцатеричный формат будет в порядке, просто сделайте
char * p = <address of some memory containing a true 64bit number>
char s[19];
для платформы Little Endian:
sprintf(s, "0x%08x%08x, *((long*)(p+4)), *((long*)(p)));
для платформы Big Endian:
sprintf(s, "0x%08x%08x, *((long*)(p)), *((long*)(p+4)));