[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends:00082] Re: String を byte 配列で書き出す方法について
中島です。こんにちは。
> 保坂ともうします。
>
> Javaは全く使っておりませんが、
> 私の直感からずれていると感じたので調べてみました。
>
> 直感 : 何のためにbyte型が存在するか?
わからないけどASCIIキャラクターだけは保存できるように
なってるんじゃないかな。
>
> なにを調べたかというと、
>
> Java言語仕様書 第二版 ピアソン・エデュケーション
> p59
> 5.1.3 プリミティブ型のナローイング変換
>
> #intからbyteへの変換はこれに該当します。
>
> で、なんと書いてあるかというと、
>
> 符合付き整数から整数型Tへのナローイング変換では、型Tを表現するために
> 使用されるビット数をnとした場合、下位nビットを除いた全てのビットが
> 破棄される。また数値の絶対量に関する情報が欠落する可能性に加えて、
> 結果となる値の符合が入力値の符合と異なる可能性も発生する。
>
> さらに、p61にはサンプルコードがあり、
> 要点だけ引用すると、
>
> System.out.println("(int)255==" + (byte)255);
>
> を実行すると、出力として
>
> (byte)255==-1
>
> を得る。
これがなんでオーバーフローしない根拠になるのかわかりません。
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#48440
4.2.1 Integral Types and Values
The values of the integral types are integers in the following ranges:
* For byte, from -128 to 127, inclusive
とあるように、-128から127しか保持できないbyte型に0x87つまり135を
代入したらオーバーフローしますよね。byte型は符号に1ビット使って
いるからASCIIキャラクタ以外の文字を代入したらオーバーフローする
可能性は大いにありますよ。
試しに
System.out.println("int:"+Integer.parseInt("87",16));
byte b = (byte)Integer.parseInt("87",16);
System.out.println("byte:"+b);
とやってみていただきたい。
>
>>オーバーフローの結果、DBの値が改ざんされてファイルに出力
>>されていると思いますよ。本当にこういうコードを書いていたら。
>
> そんなことはないというのが結論です。
いやいや、そんなことはないというのが結論です(笑)