#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 -библиотеке. Спасибо за помощь @ColinD4. Чтобы записать байт, подобный 0xca, вам просто нужно написать «(байт) 0xca». Раздражает, но просто.