Как преобразовать массив (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)));
Другие вопросы по тегам