intをバイト配列に変換するために、次のコードを使用しています。
int a = 128;
byte[] b = convertIntValueToByteArray(a);
private static byte[] convertIntValueToByteArray(int intValue){
BigInteger bigInteger = BigInteger.valueOf(intValue);
byte[] origByteArray = bigInteger.toByteArray();
byte[] noSignByteArray = new byte[bigInteger.bitLength()/8];
if(bigInteger.bitLength()%8!=0){
noSignByteArray = origByteArray;
}else{
System.arraycopy(origByteArray,1,noSignByteArray,0,noSignByteArray.length);
}
return noSignByteArray;
}
私がやろうとしていることは2つあります。
1)元の整数のバイト数(クローズバイトに切り上げ)を知る必要があります。ただし、toByteArray()メソッドを呼び出すときに符号ビットに追加される追加ビットは必要ありません。これが私がヘルパーメソッドを持っている理由です。したがって、この例では、ヘルパーメソッドがない場合、128をバイト配列に変換すると、符号ビットのために長さが2オクテットになりますが、期待しているのは1オクテットだけです。
2)数字の正の表現が必要です。この例では、配列bの最初の要素を出力しようとすると、-128になります。ただし、使用する数値は正の数のみであるため、実際に必要なのは128です。バイト配列の使用に制限されています。これを達成する方法はありますか?
更新された投稿
ご回答ありがとうございます。探していた正確な答えが見つからなかったので、詳細を説明します。最終的には、データ出力ストリームにさまざまなタイプの値を書き込みたいと思います。この投稿では、intがデータ出力ストリームに書き込まれるとどうなるかを明らかにしたいと思います。私は2つのシナリオに出くわしました。
1)
DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
byte[] b = BigInteger.valueOf(128).toByteArray();
os.write(b);
2)
DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
os.write(128);
最初のシナリオでは、バイトがデータ入力ストリームから読み取られるとき、バイト配列の最初の要素はmsbを表す0であり、配列の2番目の要素には数値-128が含まれているようです。ただし、msbは0であるため、正の数であることが意図されていると判断できます。2番目のシナリオでは、msbはなく、入力ストリームから読み取られたバイト配列に存在する要素は-128のみです。データ出力ストリームのwrite()メソッドが、BigIntegerオブジェクトでtoByteArray()メソッドが行うのと同じ方法でintをバイト配列に変換することを期待していました。ただし、msbが存在しないため、これは当てはまらないようです。したがって、私の質問は、2番目のシナリオで、msbがない場合、128は正の数であり、負の数ではないことをどのように知る必要があるかということです。