Чтобы преобразовать Int в массив байтов, я использую следующий код:Java - преобразование 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;
}
Есть две вещи, которые я пытаюсь сделать.
1) Мне нужно знать количество байтов (округленное до закрывающего байта) исходного целого числа. Тем не менее, мне не нужен дополнительный бит, который добавляется для бита знака, когда я вызываю метод toByteArray(). Вот почему у меня есть вспомогательный метод. Поэтому в этом примере, если у меня нет вспомогательного метода, когда я конвертирую 128 в массив байтов, я получаю длину 2 октета из-за знакового бита, но я ожидаю, что это будет один октет.
2) Мне нужно положительное представление числа. В этом примере, если я попытаюсь напечатать первый элемент в массиве b, я получаю -128. Однако числа, которые я буду использовать, будут только положительными числами, так что я действительно хочу 128. Я ограничен использованием байтового массива. Есть ли способ сделать это?
Обновлено сообщение
Спасибо за ответы. Я не нашел точного ответа, который я искал, поэтому я попытаюсь дать более подробную информацию. В конечном счете, я хочу писать значения разных типов по потоку вывода данных. В этом сообщении я хотел бы уточнить, что происходит, когда ints записываются в поток вывода данных. Я столкнулся с двумя сценариями.
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);
В первом сценарии, когда байты считываются из входного потока данных, кажется, что первый элемент в массиве является 0 для представления msb, а второй элемент в массиве содержит номер -128. Однако, поскольку msb равен 0, мы могли бы определить, что оно должно быть положительным числом. Во втором сценарии нет msb, и единственный элемент, присутствующий в массиве байтов, считанный из входного потока, равен -128. Я ожидал, что метод write() выходного потока данных преобразует int в массив байтов таким же образом, как метод toByteArray() для объекта BigInteger. Однако, похоже, это не так, поскольку msb нет. Поэтому мой вопрос заключается в том, как во втором сценарии мы должны знать, что 128 должно быть положительным числом, а не отрицательным, если нет msb.
Подписанный '' byte '' не может представлять число 128. Вы можете сопоставить отрицательные числа положительным числам с помощью некоторой пользовательской функции в момент, когда вы читаете значения из массива. –
@MarkoTopolnik: Упс, мозговой пердит. :п – Amadan