Я хотел бы разделить большой массив байтов на более мелкие куски (скажем, 64 байта). Пожалуйста, помогите мне с этим.разделите массив на более мелкие части
ответ
Вы можете использовать метод Arrays.copyOfRange (оригинал, от, до)
public static byte[][] divideArray(byte[] source, int chunksize) {
byte[][] ret = new byte[(int)Math.ceil(source.length/(double)chunksize)][chunksize];
int start = 0;
for(int i = 0; i < ret.length; i++) {
ret[i] = Arrays.copyOfRange(source,start, start + chunksize);
start += chunksize ;
}
return ret;
}
Или Вы можете использовать как Макс предложил System.arraycopy
public static byte[][] divideArray(byte[] source, int chunksize) {
byte[][] ret = new byte[(int)Math.ceil(source.length/(double)chunksize)][chunksize];
int start = 0;
for(int i = 0; i < ret.length; i++) {
if(start + chunksize > source.length) {
System.arraycopy(source, start, ret[i], 0, source.length - start);
} else {
System.arraycopy(source, start, ret[i], 0, chunksize);
}
start += chunksize ;
}
return ret;
}
Это действительно полезно для меня. спасибо –
Остерегайтесь того, что второй из них, как представляется, выделяет «слишком большой» последний кусок, если source.length не является четным кратным chunksize ... – rogerdpack
См Arrays.copyOfRange помощи. Вы можете использовать это в цикле, чтобы разделить ваш массив на несколько небольших кусков.
Ну, System.arraycopy (src, fromPos, dest, toPos, length) обычно считается быстрее, чем Arrays.copyOfRange.
byte[] source = ...read it from somewhere...;
byte[] newArray = new byte[64];
System.arraycopy(source, 0, newArray, 0, 64);
Это неверно: это не вопрос ускорения, «Массивы. copyOfRange' также выделяет новый 'array', тогда как' System.arraycopy' просто копирует элементы в другой 'array', передаваемый как параметр. Итак, со вторым вы сохраняете выделение .. поэтому он быстрее. Если вы проверите определение 'Array.copyOfRange', вы увидите, что он вызывает' System.arraycopy'. – Jack
Yup, только что проверил, вы правы. – bezmax
У вас есть два варианта:
System.arraycopy(...)
Array.copyOfRange(...)
оба они работают так же, но в то время как первый один управляет только копию, второй один предназначается, чтобы быть используется для одновременного выделения нового фрагмента.
Я протестированные их с результатом, который System.arraycopy
работает быстрее, если вам удастся выделить куски вместе, прежде чем разделить его массив, но немного медленнее, если вы выделяете их whle скопировать: в этом случае вы должны использовать Array.copyOfRange
.
Очень интересный тест, учитывая, что Array.copyOfRange() вызывает System.arraycopy: http://pastebin.com/SpSyx8Cd – bezmax
Это будет делать ...
первый методbyte[] source = new byte[2048];
byte[] target = new byte[1024];
// fill source with some data...
Array.Copy(source, buffer, 1024);
Дамиана VASH (в один с помощью Arrays.copyOfRange()) добавляет нули к концу последнего куска, если вход не точно кратны chunksize ,
Вы можете использовать вместо этого:
public static List<byte[]> divideArray(byte[] source, int chunksize) {
List<byte[]> result = new ArrayList<byte[]>();
int start = 0;
while (start < source.length) {
int end = Math.min(source.length, start + chunksize);
result.add(Arrays.copyOfRange(source, start, end));
start += chunksize;
}
return result;
}
и в случае, если это полезно, то же самое с помощью ArrayList-х:
public static List<List<String>> divideList(List<String> source, int chunksize) {
List<List<String>> result = new ArrayList<List<String>>();
int start = 0;
while (start < source.size()) {
int end = Math.min(source.size(), start + chunksize);
result.add(source.subList(start, end));
start += chunksize;
}
return result;
}
Если вы хотите сохранить некоторую память, небольшая модификация для Ответ Дамиана Ваша помог бы (в этом случае любой оставшийся кусок не будет иметь полный размер блока размером в 64 байта ...)
private byte[][] splitChunks(byte[] source)
{
byte[][] ret = new byte[(int)Math.ceil(source.length/(double)CHUNK_SIZE)][];
int start = 0;
for(int i = 0; i < ret.length; i++) {
if(start + CHUNK_SIZE > source.length) {
ret[i] = new byte[source.length-start];
System.arraycopy(source, start, ret[i], 0, source.length - start);
}
else {
ret[i] = new byte[CHUNK_SIZE];
System.arraycopy(source, start, ret[i], 0, CHUNK_SIZE);
}
start += CHUNK_SIZE ;
}
return ret;
}
- 1. Sub разделите словарь на более мелкие части
- 2. Разделите набор на более мелкие наборы - Java
- 3. расставание SKU на более мелкие части
- 4. php split integer на более мелкие части
- 5. Разделение контроллера директивы на более мелкие части
- 6. Разделить объект на более мелкие части
- 7. Разделение строкового буфера на более мелкие части
- 8. Отделить массив на более мелкие куски?
- 9. разделить массив на более мелкие массивы
- 10. Как нарезать большой массив на более мелкие
- 11. Как разбить массив на более мелкие массивы?
- 12. Разделите строку на более мелкие части и организуйте структуру (C-программирование)
- 13. Разделите массив на две части в Javascript
- 14. Как разбить объект javascript на более мелкие части
- 15. Структура данных для многократного разбиения строки на более мелкие части
- 16. Разбиение строки на более мелкие части основаны на Паренс
- 17. Разделите список на части
- 18. Разделите `UITableViewCell` на части
- 19. Как разделить длинную строку на более мелкие части?
- 20. делить образ диска на более мелкие части с помощью Python
- 21. Как разделить df на более мелкие части, сохранив id inact
- 22. Разбиение списка на более мелкие части (с возможным использованием калитки)
- 23. Как разделить спрайт на более мелкие части в pygame?
- 24. Функция Break PL/pgSQL на более мелкие части
- 25. Разделение большого JSON на более мелкие части в Javascript/jQuery
- 26. Разбить многоугольник на более мелкие
- 27. Hive разбивает ORC файлы на мелкие части
- 28. Разделите JSON на равные меньшие части, используя php
- 29. Имеет ли значение, если вы разделите петли на более мелкие петли?
- 30. Разделить список на более мелкие списки
Звучит похоже на http://stackoverflow.com/questions/3395547/how-to-get-a-sub-array-of-array-in-java-without-copying-data/ –