Есть ли что-то вроде bytes (byte … b):byte[]?

#java #guava

#java #гуава

Вопрос:

я ищу простой метод, который я мог бы передать в некоторых байтах, как varargs, и получить возвращенный byte[], например:

 static byte[] byteArray(byte ...bytes){ return bytes;}
  

Что я нашел до сих пор…

java.lang.Byte этого нет
java.util.Arrays этого нет

com.google.common.primitives.Bytes.toArray(..) хотите коллекцию

пример использования: assertThat(actualArray,is(byteArray(1,2,3,4,5)));

Комментарии:

1. И почему byteArray(1,2,3,4,5) лучше, чем new byte[] {1,2,3,4,5} ?

2. Вы только что написали метод! Вы можете использовать это!

3. Хорошо, мой пример реализации не самый лучший, потому byteArray(0xca,0xfe,0xba,0xbe) что не будет компилироваться.

Ответ №1:

Для этого нет функции, потому что

 new byte[]{1,2,3,4,5}
  

также довольно короткое.

Редактировать: Пожалуйста, обратите внимание, что любой вспомогательный метод, подобный этому

 static byte[] toBytes(byte ... bytes)
{
   return bytes;
}
  

имеет ту же проблему, new byte{...} что и: все аргументы должны быть реальными байтами и не распространяться на int . Таким образом, аргументы типа 0xca должны быть приведены к byte в обоих случаях:

 byte ba1[] = new byte[]{ (byte)0xca };
byte ba2[] = toBytes( (byte)0xca );
  

Если вы хотите упростить ввод, вы должны написать пользовательский метод, который выделяет массив байтов и выполняет обработку и приведение вручную.

Комментарии:

1. О чем 0xca,0xfe,0xba,0xbe ? это стало бы намного длиннее new byte[]{(byte)0xca,(byte)0xfe,(byte)0xba,(byte)0xbe}

2. Обновленный ответ на ваш комментарий.

Ответ №2:

Если вы присваиваете байты переменной или полю типа byte[] , вы можете записать это даже более компактно, чем new byte[]{1, 2, 3, 4} :

 byte[] bytes = {1, 2, 3, 4};
  

Кроме того, проблема в 0xca, 0xfe, 0xba, 0xbe том, что все эти значения фактически находятся за пределами допустимого диапазона для Java byte , поскольку byte в Java по умолчанию подписывается.

Возможно, вам нужен метод, который принимает аргумент типа long... и возвращает a byte[] , используя UnsignedBytes.checkedCast или UnsignedBytes.saturatedCast для преобразования каждого значения.

Комментарии:

1. UnsignedBytes.checkedCast(long value) сработало бы! К сожалению, в Guava отсутствует такая функция…

2. @Chriss: у Гуавы есть UnsignedBytes.checkedCast(long value) . Вы имеете в виду, что у него нет версии этого для преобразования массива? Это правда, но достаточно легко написать его самостоятельно. Вы также можете сделать запрос функции, хотя я не уверен, будет ли это считаться достаточно распространенным требованием для добавления в класс.

3. Правильно, я хочу сказать: к сожалению, нет UnsignedBytes.checkedCast(int...v):byte[] . Я тоже не уверен, достаточно ли распространен мой запрос для Guava. Я думаю, что я начинаю реализовывать это в своей личной uncommon -библиотеке. Спасибо за помощь @ColinD

4. Чтобы записать байт, подобный 0xca, вам просто нужно написать «(байт) 0xca». Раздражает, но просто.