[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00083] Re: String を byte 配列で書き出す方法について



石黒です。

0x87を見たときに私は、10000111と言ったビット列(これを仮にAと名づ
けることにします)をイメージしてしまいます。
そしてこれは8ビットの値なので、byte型に格納できると思ったりします。
Aは、これを10進数で表現しようとすると、これを符号付と見るか符号な
しと見るかによって2種類に読み取れます。
もし、byte型に0xFFを代入してそれを出力したときに-1と表示されれば
byteの中身は11111111というビットになっていると考えられ、これは自分
のイメージと合っていると思ったりできます。

bしかし、
一方、Javaの世界で、変数の中身のビット列がどうなっているかを考え
るのはナンセンスなような気もします。
無理やりキャストして、例外を制御するのも好ましくない気がします。だ
からきっとやりたいことは別の方法でできるような気がします。

それで何が言いたいかというと、今回のケースでは、
Java上、オーバーフローが起きているのは明らかですが、やりたいこと
はできていると考えられます。
つまり、0x87を10進数での表現を考えずに10000111というビット列と見
ると、なんか気持ち悪いですが、
>String strA = "0x87";
>byte bytA = (byte)Integer.parseInt(strA , 16);
というやり方で、オーバーフローによる予想外の値の改ざんなしに、や
りたいことはできている、と考えられます。

どうでしょう。


----- Original Message -----
From: "Kiyoshi Nakajima" <uf4k-nkjm@xxxxxxxxxxxxxxx>
To: <jfriends@xxxxxxxxxxxx>
Sent: Friday, January 31, 2003 10:01 AM
Subject: [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の値が改ざんされてファイルに出力
> >>されていると思いますよ。本当にこういうコードを書いていたら。
> >
> > そんなことはないというのが結論です。
>
> いやいや、そんなことはないというのが結論です(笑)
>
>
>
>