Java ByteArray эквивалент в C или переполнение стека

Каковы эквиваленты для байта Java в C, C ++

byte[]  itemsArray;
itemsArray = new byte[items *no];
itemsArray[x] = (byte) xyz;

unsigned char * itemsArray;
itemsArray = (unsigned char*) malloc (items*no);

Как назначить байты itemsArray (лайк itemsArray[x] = (byte) xyz ) в C ++ с порядком байтов для обеспечения надлежащего метеоролога.

Вышеуказанные вещи эквивалентны byteArray в C?

2

Решение

использование memcpy() копировать буферы между воспоминаниями в C,

2

Другие решения

signed char эквивалентно байту Java на большинстве платформ — стандарт C / C ++ на самом деле этого не требует, но вы можете полагаться на то, что символы будут 8-битными на всех, кроме самых непонятных платформ / компиляторов. charнезависимо от подписи, соответствует наименьшей адресуемой единице на большинстве платформ, поэтому вам не нужно беспокоиться о порядке байтов.

Вы бы присвоили массиву так же, как и любому другому массиву — в вашем примере itemsArray[x] = (unsigned char) xyz, Обратите внимание, что байты Java подписаны — я не уверен, что вы намеревались иметь unsigned там. Как отмечено в комментариях, если вы используете массив для хранения двоичных данных, это действительно обычное использование unsigned char,

3

Да они эквивалентны

Я просто хотел отметить, что это действительно хорошая идея — всегда инициализировать ваши переменные:

unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);

или же

unsigned char * itemsArray = NULL;
itemsArray = (unsigned char*) malloc (numberOfItems);

Если вы немного параноик

unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);
if(itemsArray == NULL) {
//Error, not enough memory
}

И в c ++ вы должны использовать new / delete вместо malloc / free (обратите внимание, что в C ++ вы можете использовать malloc / free, но не смешивайте их с new / delete)

unsigned char * itemsArray = new unsigned char[items*no];
1

Да, они примерно эквивалентны. Java, конечно, хранит длину массива и выполняет проверки границ для каждой ссылки на массив. C / C ++ нет, по крайней мере, не без дополнительной работы.

Я склонен использовать int8_t а также uint8_t при работе с числовыми значениями байтов в C (включая <stdint.h> чтобы получить typedefs) (см. http://www.cplusplus.com/reference/cstdint/ для большего). Это эквивалентно signed char а также unsigned char, но я считаю более ясным, что код работает с байтами. И то и другое int8_t а также signed char эквивалентны Java byte поскольку все числовые значения в Java подписаны.

Big / little-endian вступают в игру только тогда, когда вы хотите записать многобайтовое значение в массив. Если вы хотите быть в безопасности, следуйте тому же шаблону, который вы использовали бы в Java. Например.

/* example of storing in big-endian */
bytes[i+0] = (int8_t)(myint >> 24);
bytes[i+1] = (int8_t)(myint >> 16);
bytes[i+2] = (int8_t)(myint >> 8);
bytes[i+3] = (int8_t)(myint);

Если вы хотите избежать дополнительных сдвигов и записать непосредственно в байтовый массив, вы можете привести указатель байтового массива к массиву int и сохранить его, НО вы столкнетесь с двумя потенциальными проблемами: (1) указанная вами проблема с порядком байтов (решаемая) с htonl если вы не переключаете endians, смотрите http://pubs.opengroup.org/onlinepubs/007908775/xns/htonl.html) и (2) проблемы с выравниванием хранилища. Если вы попытаетесь сохранить / прочитать значение без выравнивания, в некоторых системах вы получите ошибку шины, и ваша программа потерпит крах.

/* only do this if 'i' is a multiple of 4! */
*((uint32_t*)&bytes[i]) = htonl(myint);
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector