2012-01-24 11 views
3

最後の3バイトのデータを符号なし整数から文字配列に変換する方法について説明できますか?符号なし整数をCのバイト配列に変換する

例:

unsigned int unint = some value; 
unsigned char array[3]; 
+6

*最後の3バイト*はどういう意味ですか? –

+0

私は彼が最下位3バイトを意味すると思うが、私は間違っているかもしれない。 – Nick

答えて

5

あなたは配列に変換する必要がある場合、それはより困難だが、あなただけの個々のバイトにアクセスする場合、その後、あなたは

char* bytes = (char*)&unint; 

を行うことができます実際に配列を作成したいので(最後の3バイトのコピーを作成し、それらをそのまま残さない)、

unsigned char bytes[3]; // or char, but unsigned char is better 

bytes[0] = unint >> 16 & 0xFF; 
bytes[1] = unint >> 8 & 0xFF; 
bytes[2] = unint  & 0xFF; 
+0

+1、なぜ '&0xFF'が必要ですか? – rubndsouza

5

あなたはそれをビット単位の右シフト演算子を使用して行うことができます。

array[0] = unint; 
array[1] = unint >> 8; 
array[2] = unint >> 16; 

uintの少なくともsignifcantバイトは、配列の最初の要素に格納されています。

+0

私は彼が値のASCII表現を望んでいるかもしれないと推測しています... – Nick

+0

@Nick長さ3のchar配列では? –

+0

ダニー - それはちょうど推測でした! – Nick

0

必要に応じて、あなたが労働組合を好むことがあります。

typedef union { 
    unsigned int unint; 
    unsigned char array[3]; 
} byteAndInt; 

またはビットシフト操作は:

for(int i=0; i<3; i++) 
    array[i] = (unint>>8*i) & 0xFF; 

は、前者はエンディアン安全ではありません。

+0

ユニオンの一人のメンバーに書き込み、最初に書き込むことなく他のメンバーを読むのはUBではないのですか? –

+0

標準の@Seth UBですが、これまでに遭遇したすべてのコンパイラでよく定義されています。 –

+0

ユニオンは、同じメモリゾーンが複数の方法で解釈できることを指定します。これは、1つのフィールドを書き込んで別のフィールドを読み込むことを目的としています。もちろん、ビッグエンディアンのマシンとリトルエンディアンのマシンで同じコードを実行すると、異なる結果が得られます。 UBではなく移植性の問題です。 – mouviciel

0

最後の3によるならば、あなたは、あなたがこれを使用することができます(LSB以外の言葉ですべてのバイト)LSB + 1LSB + 2MSBを意味します。

unsigned int unint = some value; 
unsigned char * array = ((unsigned char*)&some_value) + 1; 
関連する問題