英文:
Partition ByteArray to equally ByteArray of Queue
问题
所以,我从服务器得到一个动态大小的字节数组,我需要将其分成15个等大小的部分,并将其添加到我的Queue<ByteArray>
中。那么我该如何做呢?
实际上,我需要为我的BLE设备做这个。我正在进行固件更新,我需要将字节数组均匀地分成每个包含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) {
// 待办事项:将字节数组分成20个等大小的部分,并将其添加到sendQueue中。
}
sendQueue.add(data)
if (!isWriting) _send(gatt)
return 0 // 0
}
(注意:以上为您提供的代码翻译,代码中的注释仍然是英文的,因为您要求不翻译代码部分的内容。)
英文:
So, I have a ByteArray of dynamic size from the server and I need to divide it into 15 equal size and add it to my Queue<ByteArray>
. So how do I do this?
I need this for my BLE device actually. I'm doing a firmware update and I need to convert the bytearray into equally 20 bytes each inside the Queue so that it happens smoothly?
for example bytearray received from the server is 256. I want to have my
queue[0]=bytes[0-15] onpeek()
queue[1]=bytes[16-30] onPeek()
queue[2]=bytes[31-45]onPeek()
...
....
queue[n]= bytes[240-255] onPeek()
My code:
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
得分: 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);
}
// 并且我们添加了最后一部分(如果 "len % 20 != 0",它可能会比其他部分稍大)。
var newArray = Arrays.copyOfRange(bytes, partSize * (partCount - 1), len);
sendQueue.add(newArray);
英文:
You can try something like this (draft, not checking)
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
得分: 1
我不确定是否理解您的问题,但这可以指引方向:
dataByte.asIterable().chunked(15).forEach {
// 'it' 是一个 List<Byte>,将其转换为 ByteArray 以便添加到队列。
sendQueue.add(it.toByteArray())
}
将dataByte
定义为Iterable
将允许您将其按您想要的大小进行分块,然后您只需遍历其结果并将其添加到队列中。
英文:
I'm not sure if understood your question but this can give a direction
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())
}
referring dataByte as Iterable
will allow you to chunk it to the size you want,
then all you need is to iterate over it's results and add it to your queue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论