2013-04-19 6 views
2

Quels sont l'équivalent pour l'octet Java en C, C++équivalent Java ByteArray en C ou C++

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

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

Comment attribuer octets à itemsArray (comme itemsArray[x] = (byte) xyz) en C++ avec endianess pour assurer la ByteOrder appropriée.

Les choses ci-dessus sont-elles équivalentes à byteArray en C?

+0

En C++, utilisez 'std :: vector '. –

+0

L'endianness est seulement un problème si vous essayez d'écrire des valeurs multi-octets dans un tableau d'octets; vous semblez seulement demander à écrire des octets simples dans le tableau. Peut-être voulez-vous dire que 'xyz' est une valeur plus grande (taille' no', peut-être?) Et que vous voulez écrire tous ses octets dans le tableau? En outre, C et C++ sont des langages très différents; De quoi parlez-vous? –

Répondre

2

Utilisez memcpy() pour copier les tampons entre les mémoires dans C.

1

Oui, ils sont équivalents

Je voulais simplement dire qu'il est une très bonne idée à init toujours vos variables:

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

ou

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

Si vous êtes un peu paranoïaque:

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

Et C++ vous devez utiliser un nouveau/supprimer au lieu de malloc/gratuit (notez que dans C++, vous pouvez utiliser malloc/libre, mais ne pas les mélanger avec de nouveaux/supprimer)

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

signed char est équivalent à Java octet sur la plupart des plates-formes - la norme C/C++ ne l'exige pas réellement, mais vous pouvez compter sur des caractères 8 bits sur toutes les plates-formes/compilateurs les plus obscurs. char, indépendamment de la signature, correspond à la plus petite unité adressable sur la plupart des plates-formes, donc vous ne devriez pas avoir à vous soucier de l'endianness du tout.

Vous affecteriez à la baie comme vous le feriez avec n'importe quelle autre baie - dans votre exemple itemsArray[x] = (unsigned char) xyz. Notez, cependant, que les octets de Java sont signés - je ne suis pas sûr si vous vouliez avoir unsigned là dedans. Comme indiqué dans les commentaires, si vous utilisez le tableau pour stocker des données binaires, il est en effet habituel d'utiliser unsigned char.

+0

Non, c'est faux. C et C++ * do * exigent que 1 char = 1 octet. –

+0

@Konrad: Un java 'byte' (le type de données) est toujours de 8 bits. Un octet en C/C++ peut avoir d'autres tailles. –

+0

@Klas Vrai. Mais: Un 'char' en C++ a une taille d'un octet. §3.3.5 dit que 'sizeof (char) == 1', et que' sizeof' donne la taille d'un type en octets. –

1

Oui, ils sont à peu près équivalents. Java stocke bien sûr la longueur du tableau et effectue des contrôles sur chaque référence de tableau. C/C++ ne pas, au moins pas sans travail supplémentaire.

J'ai tendance à utiliser int8_t et uint8_t lorsqu'ils traitent avec des valeurs d'octets numériques en C (y compris <stdint.h> pour obtenir les typedefs) (voir http://www.cplusplus.com/reference/cstdint/ pour plus). C'est équivalent à signed char et unsigned char, mais je trouve qu'il est plus explicite que le code travaille sur des octets. Les deux int8_t et signed char sont équivalents à Java byte car toutes les valeurs numériques dans Java sont signées.

Le format big/little-endian n'est utilisé que lorsque vous voulez écrire une valeur multi-octets dans le tableau. Si vous voulez être du bon côté, suivez le même schéma que vous utiliseriez en Java. Par exemple.

/* 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); 

Si vous voulez éviter les quarts de travail supplémentaires et écrire directement au tableau d'octets, vous pouvez lancer le pointeur de tableau d'octets à un tableau int et le magasin, mais vous courrez dans deux problèmes potentiels: (1) problème endian que vous avez souligné (résoluble avec un htonl sauf si vous ne changez pas d'endian, voir http://pubs.opengroup.org/onlinepubs/007908775/xns/htonl.html), et (2) des problèmes d'alignement de stockage. Si vous essayez de stocker/lire une valeur non alignée, sur certains systèmes, vous obtiendrez une erreur de bus et votre programme tombera en panne.

/* only do this if 'i' is a multiple of 4! */ 
*((uint32_t*)&bytes[i]) = htonl(myint);