2016-11-01 8 views
0

私は、プロジェクト内で圧縮目的で可変長整数を使用しようとしています。今、私は、実際に長さが何バイト(つまり、それを正しく表示するために使用する必要があります)の長さの符号なしlongの実際の長さを計算する関数があります。私は配列に記入されている符号なしlong longの部分をコピーすることはできません(たとえば、long long 0000 ... 0000 10110010から10110010バイトをコピーしたいとします)。私はmemcpyを試しましたが、これはうまくいかないようです。これどうやってするの?Cの配列にunsigned long longの最下位バイトをコピー

これは、これまでの私のコードです:

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(リトルまたはビッグエンディアン)で指定されていないという事実から来ていると思うが、私ができますこの問題の解決策を見つけるように思われる。

+0

メモリの割り当てを避けますか? 'temp&0xFF'とバイトサイズの型にキャスト –

+0

不明なコードについて... 3つの未知の関数といくつかの未知の変数型がここで使用しています!このコードへの入力とは正確に何か(つまり、 'input'変数の型)ですか? –

答えて

1

これを移植するには、shiftを使用します。数値をバイトに分解するには、右に移動します。バイト数を再構成するには、shift leftを使用します。例:

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; 
関連する問題