2016-05-26 3 views
0

У меня есть два длинных числа a и b с 8 байтами каждый. У меня также есть 16-байтовый массив arr. Я хочу поместить первый 8-байтовый массив с a и последним 8-байтовым массивом с b.конвертировать длинное длинное число в массив символов в c

Я хотел бы сделать что-то вроде этого:

#include <stdio.h> 

int main() { 
    long long a = 123456; 
    long long b = 654321; 
    unsigned char arr[16]; 

    memcpy(arr, a, 8); 
    memcpy(arr + 8, b, 8); 

    return 0; 
} 

Компилятор говорит мне, что

несовместимого целое с указателем Попутно преобразования «длинный длинный» для параметра типа «Const недействительной * '[-Wint-conversion]

Мой вопрос заключается в том, как преобразовать длинное длинное в байты, которые могут вписываться в мой массив?

ответ

1

Вы должны использовать:

void convertToCharArray(unsigned char *arr, long long a) 
{ 
    int i = 0; 

    for (i = 0; i < 8; ++i) 
    { 
     arr[i] = (unsigned char)((((unsigned long long) a) >> (56 - (8*i))) & 0xFFu); 
    } 
} 

int main() 
{ 
    long long a = 123456; 
    long long b = 654321; 
    unsigned char arr[16]; 

    convertToCharArray(&arr[0], a); 
    convertToCharArray(&arr[8], b); 

    printf("a => %llx\n", a); 
    printf("b => %llx\n", b); 

    printf("arr =>"); 
    for(i = 0; i < 16; ++i) 
    { 
     printf("%x", arr[i]); 
    } 
} 

результаты:

а => 1e240
Ь => 9fbf1
обр => 000001e240000009fbf1

пример here

convertToCharArray извлекать каждый байт a и помещать его в другую ячейку массива. Наиболее значимый байт индекса 0. Это то же самое, как это:

// Save MSB in 0 
arr[0] = (unsigned char)((((unsigned long long) a) >> 56) & 0xFFu); 
// Save second MSB in 1 
arr[1] = (unsigned char)((((unsigned long long) a) >> 48) & 0xFFu); 
... 
// Save seventh MSB in 6 
arr[6] = (unsigned char)((((unsigned long long) a) >> 8) & 0xFFu); 
// Save LSB in 7 
arr[7] = (unsigned char)(((unsigned long long) a) & 0xFFu); 

оператор >> является «побитовое смещение вправо» оператор: он работает сдвиг n битов на левом операнде (где n является правый операнд). Итак, a >> 8 сдвигает a вправо от 8 бит => он помещает второй байт на место первого байта. После этого я использую оператор &, который является «побитовым» оператором для реализации маски для активации только необходимого байта.

Не используйте memcpy сделать это (проблема переносимости и безопасности)


И просто, чтобы ответить на ваш вопрос, memcpy ожидает иметь указатель на 2 первых аргументов, так что вы должны пройти &a и &b. & извлекает адрес переменной.

+0

Это отлично работает для меня. Кстати, не могли бы вы вкратце объяснить, что вы сделали в своей функции конвертации? Для меня это волшебство :) – Luke

+0

@ Luke see edit. Дайте мне знать, если этого достаточно – Garf365

+0

Этого достаточно. Большое спасибо. – Luke

Смежные вопросы