Каковы эквиваленты для байта 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?
использование memcpy()
копировать буферы между воспоминаниями в C
,
signed char
эквивалентно байту Java на большинстве платформ — стандарт C / C ++ на самом деле этого не требует, но вы можете полагаться на то, что символы будут 8-битными на всех, кроме самых непонятных платформ / компиляторов. char
независимо от подписи, соответствует наименьшей адресуемой единице на большинстве платформ, поэтому вам не нужно беспокоиться о порядке байтов.
Вы бы присвоили массиву так же, как и любому другому массиву — в вашем примере itemsArray[x] = (unsigned char) xyz
, Обратите внимание, что байты Java подписаны — я не уверен, что вы намеревались иметь unsigned
там. Как отмечено в комментариях, если вы используете массив для хранения двоичных данных, это действительно обычное использование unsigned char
,
Да они эквивалентны
Я просто хотел отметить, что это действительно хорошая идея — всегда инициализировать ваши переменные:
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];
Да, они примерно эквивалентны. 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);