首页 > 解决方案 > C中的Java ByteBuffer?

问题描述

我需要将使用 ByteBuffer 对象的 Java 方法转换为 C。如何使用 Java 的 ByteBuffer 准确复制下面的代码?我应该使用哪些数据类型将浮点数嵌入字节数组(在 C 中)?

我谈到的代码:

public void example(float[] floatData) {
    //Initialize byte array "byteData"
    byte[] byteData = new byte[floatData.length * 4];
    ByteBuffer byteDataBuffer = ByteBuffer.wrap(byteData);
    byteDataBuffer.order(ByteOrder.nativeOrder());

    //Fill byte array with data from floatData
    for (int i = 0; i < floatData.length; i++)
    byteDataBuffer.putFloat(floatData[i]);

    //Concat length of array (as byte array) to "byteData"
    byte[] vL = intToByteArray(floatData.length / 2);
    byte[] v = concatArrays(vL, byteData);

    //Fill the remaining array with empty bytes
    if (v.length < 1024) {
        int zeroPad = 1024 - v.length;
        byte[] zeroArray = new byte[zeroPad];
        v = concatArrays(v, zeroArray);
        zeroArray = null;
    }

    //[Do something with v[] here...]
}

FloatData[] 看起来像这样:1.00052387686001,-1.9974419759404,0.996936345285375

标签: javacbytebuffer

解决方案


用于calloc分配空间(1024)。将长度设置为第一个sizeof(int)字节,然后用于memcpy将浮点数组复制到分配内存的其余部分 ( sizeof(float)*length)。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void example(float * fAry, int length){
    int i;
    unsigned char* bAry = calloc(1024,1);

    memcpy(bAry,&length,sizeof(int));    
    memcpy(bAry + sizeof(int), fAry, length*(sizeof(float)));

    for (i=0; i<20; i++){
        printf("%u,",bAry[i]);
    }

    free(bAry);
}


int main()
{
    float ary[3] ={1.1,1.2,1.3};

    example(ary,3);

    return 0;
}

输出:

3,0,0,0,205,204,140,​​63,154,153,153,63,102,102,166,63,0,0,0,0,


推荐阅读