Разделите ByteArray на равные ByteArray очереди

#java #android #arrays #kotlin

#java #Android #массивы #kotlin

Вопрос:

Итак, у меня есть ByteArray динамического размера с сервера, и мне нужно разделить его на 15 равных размеров и добавить его к моему Queue<ByteArray> . Итак, как мне это сделать?

На самом деле мне это нужно для моего устройства BLE. Я выполняю обновление прошивки, и мне нужно преобразовать bytearray в равные 20 байтов каждый внутри очереди, чтобы это происходило плавно?

например, байтовый массив, полученный с сервера, равен 256. Я хочу, чтобы мой

 queue[0]=bytes[0-15] onpeek() 
queue[1]=bytes[16-30] onPeek()
queue[2]=bytes[31-45]onPeek()
 ...
....
queue[n]= bytes[240-255] onPeek()
  

Мой код:

 private val sendQueue: Queue<ByteArray> = ConcurrentLinkedQueue()

    @Volatile
    private var isWriting = false


    fun send(
        dataByte: ByteArray,
        gatt: BluetoothGatt
    ): Int {
        var data = dataByte
        while (data.count() > 15) {

//            todo divide into 20 equal byte array and add it to sendQueue.
           
        }
        sendQueue.add(data)

        if (!isWriting) _send(gatt)
        return 0 //0
    }
  

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

1. Кто сказал, что длина вашего массива делится равномерно на 15?

2. @GhostCat вы можете увидеть редактирование, которое у меня есть. Думаю, теперь я понял?

3. Нет, я не понимаю, как 3 массива по 15 байт каждый приводят к 256 байтам.

4. @GhostCat он будет продолжать увеличиваться. Массивы до тех пор, пока не будет найдено совпадение. На самом деле.

5. Извините, это все еще не имеет смысла для меня. Трей, чтобы писать супер простые предложения. объект подлежащего глагола. приведите нам «полный» пример. 3 * 15 не равно 256.

Ответ №1:

Вы можете попробовать что-то вроде этого (черновик, а не проверка)

 var partCount = 20;
var data = dataByte;
var len = data.getLength();
var partSize = len / partCount;  
for (int i = 0; i < partCount - 1; i  ) {    
    var newArray = Arrays.copyOfRange(bytes, i * partSize, (i   1) * partSize);
    sendQueue.add(newArray);
}
// and we added last part (may be a little bigger then other parts if "len % 20 != 0").
var newArray = Arrays.copyOfRange(bytes, partSize * (partCount - 1), len); 
sendQueue.add(newArray);
  

Ответ №2:

Я не уверен, понял ли ваш вопрос, но это может дать направление

 dataByte.asIterable().chunked(15).forEach { 
    // 'it' is a List<Byte>, convert it to ByteArray in order to add it to queue.
    sendQueue.add(it.toByteArray())
}
  

ссылка на dataByte as Iterable позволит вам обрезать его до нужного размера
, тогда все, что вам нужно, это перебрать его результаты и добавить его в свою очередь.

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

1. Я думаю, что получение байтового массива списка отличается от элементов внутри байтового массива списка. Так что это может не сработать.