Java ByteBuffer в C?

Мне нужно перевести метод Java, который использует объект ByteBuffer, на C. Как я могу точно воспроизвести приведенный ниже код, используя ByteBuffer Java? И какие типы данных я должен использовать для встраивания поплавков в массив байтов (в 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

Используйте calloc, чтобы выделить место (1024). Установите длину как первый байт sizeof(int), затем используйте memcpy, чтобы скопировать массив с плавающей запятой в остальную часть выделенной памяти (sizeof(float)*length). Я нигде не вижу p[]?

yhyrcanus 07.06.2019 21:12

Да, я удалил это в последнюю минуту, потому что это не имело значения

ThePBone 07.06.2019 21:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
523
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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,

Другие вопросы по теме