2011-01-26 7 views
4

私が現在やっているいくつかのアドバイスを聞くことができるのだろうかと思います。4バイトで4つの整数?

私は次の言葉を引用STANAG文書から働いています:

ID番号が4バイトの数字として形成されなければなりません。最初の(最も重要な)バイトは、問題のオブジェクトの標準NATO国コードとする。有効な国コードの範囲は10進数で0〜99です。国コード255(16進数FF)を予約します。

次に、3つの他のバイトについて詳しく説明します。この仕様では、IDに整数型4が与えられます。ここで、整数nは符号付き整数で、nは1,2または4バイトです。

私の質問ですが、これは無意味な質問とみなされることがありますが、私は謝ります。私たちが知っているように32ビット/ 4バイトの整数です。 「最初のバイト」は、99が整数の場合、たとえば99のようにはどうですか?

私はここでの説明を大変うれしく思います。

+1

どのように4586があなたを扱いますか? – I82Much

+0

ひどく、正直に言うと: – Myn

+0

私は、私が世界で唯一の4586だったと思った! –

答えて

4

整数は通常4バイトです。しかし、99のような小さい数を格納すると、他の3つのバイトに8倍の0の値のビットが格納されます。この仕様では、1つの整数ストレージ(4バイト)を使用して、そのバイト内に4つの小さい番号を格納するよう求めています。

おそらく最も簡単な方法は、4バイトの配列にtoInt関数を使用することです。 (そこにはバイト[]の長さのチェックがあることも、この機能がテストされる - それは単なる例示である)INT

11110101 00000100 00001001 00000000 
^byte  ^byte  ^byte  ^byte 

public static final int toInt(byte[] b) 
{ 
    int l = 0; 
    l |= b[0] & 0xFF; 
    l <<= 8; 
    l |= b[1] & 0xFF; 
    l <<= 8; 
    l |= b[2] & 0xFF; 
    l <<= 8; 
    l |= b[3] & 0xFF; 
    return l; 
} 

byte[] bytes = new byte[] {99, 4, 9, 0}; 
int i = toInt(bytes, 0); 

32ビット整数に8ビットの各ブロック小さな数字を「エンコードする」/「格納する」には十分です。したがって、intを使用して4つの小さい数字をマッシュすることができます。

+0

Ah ..私は知っている私は仕様の "整数4"の部分を誤解している - あなたとT.J.つまり、整数型ではなく整数型である必要があります。私はプログラミングモードで私の脳でそれを見ていた、それは突然もっと意味をなさない!とにかく、バイト配列として使用されることを私が知っているので、toInt関数を必要としませんが、まさに私が後にしているようなものです。お二人とも大変ありがとうございました。あなたは今朝私に迷惑をかけているものを取り除いただけです! – Myn

+0

フォローアップの質問として、同じやり方で二重または文字を使用しますか?だから、ダブル "51.304215"または文字列 "T - 321"の代わりに、バイト配列? – Myn

+0

これはバイトとして終わるので、いつでも任意のストレージに強制的にビットシフトすることができます。 – RichardTheKiwi

3

「99」は数学的には整数ですが、必ずしもJavaの観点からはIntegerまたはintである必要はありません。値99は、例えば、short(「短い整数」の略語)(これは16ビットデータ型)またはbyte(8ビットデータ型)に保持されます。

だから、基本的には、IDのものを一連の4つの値として見ることになります。byte Javaのbyteタイプが署名されていることに注意してください。

+0

cyberkiwiと同じコメントですが、私は2つの最善の答えを与えることができますが、あなたに非常に感謝します。あなたの説明は非常に有用でした。 – Myn

+0

@ミン:心配しなくても助かりました。 –

1

整数(外部演算)とは、2、99、-5、34134、427391471244211などを含む任意の値を意味します。 整数では、伝統的には32ビットの数値です。それに収まる任意の値が含まれています。 その(計算)整数値の各バイト(8ビット)は、0から255までの個々の(数値)整数です。

関連する問題