2011-08-07 6 views
3

サイズ2,3または4のバイト配列があります。これを正しい整数値に変換する必要があります。また、これを逆に行う必要があります。つまり、バイト配列に対して2,3または4文字の整数です。US-ASCIIでエンコードされたバイトを整数に変換して戻す

例えば、生の進バイトがある:54と49デコードされた文字列US-ASCII値は61であるので、整数の答えは、私はstackoverflowのなどそのI上のすべての変換の質問を読んだ61

にする必要があります見つけることができますが、彼らはすべて完全に間違った答えを与える、私はそれがエンコードすることができるかどうかわからない?

new String(lne,"US-ASCII")の場合、lneは私のバイト配列ですが、正しい61が得られます。しかし、このとき((int)lne[0] << 8) | ((int)lne[1] & 0xFF)を実行すると、完全に間違った答えが表示されます。

これは愚かな間違いかもしれませんが、私はJavaの数表現スキームとエンコーディング/デコードの考え方を完全に理解していません。

ご協力いただければ幸いです。

注:文字列を整数に解析することはできますが、代わりにシフト演算やバイナリ演算などの高速演算を使用する方法があるかどうかを知りたいと思いますか?

答えて

3

2つの変換ステップが必要です。まず、asciiバイトを文字列に変換します。それはnew String(lne,"us-ascii")のためです。 の場合は、数値の文字列表現を実際の数値に変換します。そのためには、Integer.parseInt(theString)のようなものを使用してください。NumberFormatExceptionを処理することを忘れないでください。

1

あなたが言うように、new String(lne,"US-ASCII")はあなたに正しい文字列を与えます。文字列を整数に変換するにはint myInt = Integer.parseInt(new String(lne,"US-ASCII"));

4

これを高速化するために、バイトシフトや小数点演算などの高速演算を使用する方法について考えます。あなたは、現在のコードを持っていると仮定すると:

byte[] token; // bytes representing a bunch of ascii numbers 
int n = Integer.parseInt(new String(token)); // current approach 

次にあなたが代わりにその最後の行を交換し、(など、一切の外国のlangaugeの文字、何の負の数を想定していない)は、次の操作を行うことができます:のうち

int n = 0; 
for (byte b : token) 
    n = 10*n + (b-'0'); 

大規模なデータセットでは、これは約28%のスピードアップとなりました。これは、新しいStringオブジェクトを割り当てずに、parseIntコールごとにゴミ箱を廃棄する必要がないためだと思います。

関連する問題