2016-11-01 10 views
0

Я пытаюсь использовать целые числа переменной длины для целей сжатия в проекте. Теперь у меня есть функция, которая вычисляет то, что фактическая длина unsigned long long в байтах (таким образом, сколько байтов должно использоваться для правильного отображения). Я не буду копировать часть unsigned long long, которая заполняется в массив (так, например, я хочу скопировать 10110010 байт из длинного 0000 ... 0000 10110010). Я пробовал memcpy, но это не работает. Как я могу это сделать?Копировать наименьшие байты беззнакового длинного длинного массива в C

Это мой код до сих пор:

if (list_length(input) >= 1) { 
    unsigned long long previous = list_get(input, 0); 
    unsigned long long temp; 
    for (unsigned int i = 1; i < list_length(input); i++) { 
     temp = list_get(input, i); 
     unsigned long long value = temp - previous; 
     size = delta_get_byte_size(value); 
     memcpy(&output[currentByte], &value, size); 
     currentByte += size; 
     previous = temp; 
    } 
} 

Я думаю, что проблема связана с тем, что порядок отдельных байтов, не указанных в C (мало- или обратного порядка), но я могу» t, похоже, найти решение этой проблемы.

+0

а затем избегать добавления памяти? 'temp & 0xFF' и отбрасывается в байтовый тип –

+0

Говоря о нечетком коде ... Здесь есть 3 неизвестные функции и несколько неизвестных типов переменных! Что именно вводит этот код (т. Е. Тип переменной 'input')? –

ответ

1

Чтобы сделать это переносимо, используйте смену. Чтобы разложить число на байты, сдвиньте вправо. Чтобы переупорядочить число из байтов, используйте сдвиг влево. Например:

a[0] = x; 
a[1] = x >> 8; 
a[2] = x >> 16; 
a[3] = x >> 24; 
a[4] = x >> 32; 

x = a[0]; 
x += (unsigned)a[1] << 8; 
x += (unsigned long)a[2] << 16; 
x += (unsigned long)a[3] << 24; 
x += (unsigned long long)a[4] << 32; 

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

  • Нет связанных вопросов^_^