ByteBuffer b =ByteBuffer.allocate(4);//b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
b.putInt(0xAABBCCDD);byte[] result = b.array();
Установка обеспечивает порядка байтов , что result[0] == 0xAA, result[1] == 0xBB, result[2] == 0xCCи result[3] == 0xDD.
ByteBufferКласс был разработан для таких грязных рук задач , хотя. Фактически, private java.nio.Bitsопределяет эти вспомогательные методы, которые используются ByteBuffer.putInt():
это бы хорошо работало, если бы байтовый буфер уже был там ... в противном случае кажется, что это заняло бы больше времени, чем просто выделение байтового массива длины 4 и выполнение сдвига вручную ... но мы, вероятно, говорим о небольших различиях.
Джейсон С
Экземпляр ByteBuffer может быть кэширован; и внутренне это конечно выполнено с перемещением и маскировкой так или иначе.
Григорий Пакош,
4
Это прекрасный ответ. Обратите внимание, что big-endian является указанным по умолчанию, а методы являются «цепочечными», а аргумент position является необязательным, поэтому все сводится к: byte [] result = ByteBuffer.allocate (4) .putInt (0xAABBCCDD) .array ( ); Конечно, если вы делаете это многократно и объединяете все результаты вместе (что часто случается, когда вы делаете подобные вещи), выделите один буфер и многократно вставьте в него все, что вам нужно - он будет следить за смещением по мере движения. Это действительно чрезвычайно полезный класс.
Кевин Бурриллион
что это дает для подписанных типов?
Григорий Пакош
3
Для тех, кто не знает. PutInt всегда записывает 4 байта, независимо от размера входного целого числа. Если вам нужны только 2 байта, используйте putShort и т. Д.
bvdb
36
Использование BigInteger:
privatebyte[] bigIntToByteArray(finalint i ){BigInteger bigInt =BigInteger.valueOf(i);return bigInt.toByteArray();}
Использование DataOutputStream:
privatebyte[] intToByteArray (finalint i )throwsIOException{ByteArrayOutputStream bos =newByteArrayOutputStream();DataOutputStream dos =newDataOutputStream(bos);
dos.writeInt(i);
dos.flush();return bos.toByteArray();}
Использование ByteBuffer:
publicbyte[] intToBytes(finalint i ){ByteBuffer bb =ByteBuffer.allocate(4);
bb.putInt(i);return bb.array();}
@Pascal Использование ByteBuffer Я пытался с ByteBuffer bb = ByteBuffer.allocate (3); Для этого он дает java.nio.BufferOverflowException, я не понимаю, почему он не работает для значения меньше 4? Не могли бы вы объяснить?
Санджай Джейн,
@SanjayJain Вы получаете исключение переполнения буфера, потому что в Java целые 32-битные или 4-байтовые по размеру, и, следовательно, вы должны выделить как минимум 4 байта памяти в вашем ByteBuffer.
шокирующая
@GregoryPakosz прав насчет порядка байтов. Его использование ответа ByteBufferболее интуитивно
Также ничего не стоит, что это будет работать независимо от самого значительного и более эффективного по сравнению с другими ответами. Также можно использовать «>>».
Алкогольный
1
Такое прямое решение, безусловно, быстрее, чем вызов любого библиотечного метода. Иногда вам просто нужно поиграться с битами непосредственно с помощью нескольких строк кода, вместо того, чтобы брать на себя все лишние затраты на вызовы библиотечных методов.
Дэвид Р. Триббл
И это хорошо конвертирует между языками, что хорошо для многоязычной разработки программного обеспечения.
Координатор
15
Если вам нравится Guava , вы можете использовать его Intsкласс:
int intValue =Ints.fromByteArray(newbyte[]{(byte)0xAA,(byte)0xBB,(byte)0xCC,(byte)0xDD});int intValue =Ints.fromBytes((byte)0xAA,(byte)0xBB,(byte)0xCC,(byte)0xDD);
Возвращаемый массив имеет размер, необходимый для представления числа, поэтому он может иметь размер 1, например, 1. Однако размер не может быть больше четырех байтов, если передается int.
Из строк:
BigInteger v =newBigInteger("AABBCCDD",16);byte[] array = v.toByteArray();
Тем не менее, вам нужно следить, если первый байт будет выше 0x7F(как в этом случае), где BigInteger вставит байт 0x00 в начало массива. Это необходимо для различения положительных и отрицательных значений.
Спасибо! Но так как это BigInteger, правильно ли обернуты int? То есть целые числа, которые находятся вне Integer.MAX_VALUE, но все еще могут быть представлены только 4 байтами?
Лютик
1
Это, конечно, не быстро выполнить. ;)
Питер Лори
Это не хороший вариант. Мало того, что он может добавить 0x00 байт, он также может удалить начальные нули.
ZZ Coder
1
Простое решение, которое правильно обрабатывает ByteOrder:
Вот метод, который должен делать работу правильно.
publicbyte[] toByteArray(int value){finalbyte[] destination =newbyte[Integer.BYTES];for(int index =Integer.BYTES -1; index >=0; index--){
destination[i]=(byte) value;
value = value >>8;};return destination;};
publicvoid getBytes(int val){byte[] bytes =newbyte[Integer.BYTES];for(int i =0;i < bytes.length; i ++){int j = val %Byte.MAX_VALUE;
bytes[i]=(j ==0?Byte.MAX_VALUE : j);}}
Также Stringу метод:
publicvoid getBytes(int val){String hex =Integer.toHexString(val);byte[] val =newbyte[hex.length()/2];// because byte is 2 hex charsfor(int i =0; i < hex.length(); i+=2)
val[i]=Byte.parseByte("0x"+ hex.substring(i, i+2),16);return val;}
Ответы:
Посмотрите на класс ByteBuffer .
Установка обеспечивает порядка байтов , что
result[0] == 0xAA
,result[1] == 0xBB
,result[2] == 0xCC
иresult[3] == 0xDD
.Или же вы можете сделать это вручную:
ByteBuffer
Класс был разработан для таких грязных рук задач , хотя. Фактически, privatejava.nio.Bits
определяет эти вспомогательные методы, которые используютсяByteBuffer.putInt()
:источник
Использование
BigInteger
:Использование
DataOutputStream
:Использование
ByteBuffer
:источник
ByteBuffer
более интуитивноиспользуйте эту функцию, она работает для меня
он переводит int в байтовое значение
источник
Если вам нравится Guava , вы можете использовать его
Ints
класс:Для
int
→byte[]
используйтеtoByteArray()
:Результат есть
{0xAA, 0xBB, 0xCC, 0xDD}
.Его реверс
fromByteArray()
илиfromBytes()
:Результат есть
0xAABBCCDD
.источник
Вы можете использовать
BigInteger
:Из целых чисел:
Возвращаемый массив имеет размер, необходимый для представления числа, поэтому он может иметь размер 1, например, 1. Однако размер не может быть больше четырех байтов, если передается int.
Из строк:
Тем не менее, вам нужно следить, если первый байт будет выше
0x7F
(как в этом случае), где BigInteger вставит байт 0x00 в начало массива. Это необходимо для различения положительных и отрицательных значений.источник
Простое решение, которое правильно обрабатывает ByteOrder:
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();
источник
очень легко с Android
источник
Это поможет вам.
источник
Можно также сдвинуть -
источник
Вот метод, который должен делать работу правильно.
источник
Это мое решение:
Также
String
у метод:источник