Je n'ai trouvé aucune solution parmi les nombreux nombreux threads à ce sujet. Mon problème exact est:
J'ai un éventail d'entiers tels que Je voudrais accéder à ces entiers Char par Char, ce qui signifie que j'ai besoin de lire: Remarque: je voudrais aussi faire le contraire: avoir un tableau de charcuterie avec une taille telle que y a-t-il un moyen de faire une telle chose? p> Exemple reproductible minimal: P> non signé int arr [2] = {0xfebd1213, 0x1213febd}; code> p>
0x13, 0x12, 0xbd, 0xfe, 0xbd, 0xfe, 0x13, 0x12 code>.
J'ai essayé beaucoup, beaucoup de choses et je n'ai pas encore réussi. P>
taille% 4 == 0 code> et le lire comme une matrice entier. E.g:
Unsigned Char Arr [8] = {0x13, 0x12, 0xbd, 0xfe, 0xbd, 0xfe, 0x13, 0x12} Code> et Lire
0xfebd1213, 0x1213febd Code>; P>;
blockquote>
#include <stdio.h>
#include <stdlib.h>
void main(void){
unsigned int arr[2] = {0xFEBD1213, 0x1213FEBD};
unsigned char * ptr;
ptr = *&arr; // I need a variable. Printing it doesn't matter to me. I am aware that there are easy solutions to print the right values there.
for(int i = 0; i < 2 * 4; i++){
printf("%x\n", *ptr);
ptr = (ptr++);
}
}
3 Réponses :
Un simple décalage et travaillera: Exemple Utilisez / sortie STROND> P> $ ./bin/arrbytes
0x13
0x12
0xbd
0xfe
0xbd
0xfe
0x13
0x12
Ce n'était pas exactement ce dont j'avais besoin. J'avais besoin d'une variable de pointeur à partir desquelles je peux itération de la gamme. Néanmoins, merci pour votre réponse. J'ai posté ma solution ci-dessus.
Aimer. Très élégant
@jijuji Le problème avec l'utilisation d'un pointeur est qu'il ne prend pas en compte latitien. Si vous deviez simplement itérer sur les octets dans 0xfebd1213 code> sur une petite machine Endian, votre commande serait
13 code>,
12 code>,
BD code>,
Fe code> (où LSB est stocké d'abord en mémoire). Lorsque vous utilisez des décalages, le compilateur gère l'octet-commander de manière appropriée. Essayez avec
non signé Char * p = (non signé Char *) Art; code> puis itérer avec
pour (; p! = (Non signé Char *) & arr [0] + Tailleofr; p ++) < / Code> - Votre commande d'octets est inversée sur le.
@ DAVIDC.RANKIN C'est exactement ce dont j'ai besoin, car il conserve l'endansion.
#include <stdio.h> #include <stdlib.h> void main(void){ unsigned int arr[2] = {0xFEBD1213, 0x1213FEBD}; unsigned char * ptr; ptr = &arr; for(int i = 0; i < 2 * 4; i++){ printf("%x\n", *ptr); ptr = &*(ptr)+1; } unsigned char arr_c[8] = {0x13, 0x12, 0xBD, 0xFE, 0xBD, 0xFE, 0x13, 0x12}; unsigned int * ptr_i; ptr_i = &arr_c; for(int i = 0; i < 2; i++){ printf("%x\n", *ptr_i); ptr_i = &*(ptr_i)+1; } }
Ne postez pas le code sans explication où l'erreur était.
PTR = & * (PTR) +1; code> est affreux.
Vous pouvez utiliser une sorte d'analyseur:
void AccessAsCharArr(void *arr, size_t size); int main() { unsigned int arr[] = {0xFEBD1213, 0x1213FEBD, 0xFF000366}; AccessAsCharArr(arr, sizeof(arr)); return 0; } void AccessAsCharArr(void *arr, size_t size) { unsigned char *ptr = arr; for (size_t i = 0; i < size; i++) { printf("%hhx ", *ptr); ptr++; } }
pTR = (ptr + i); code> ==>
ptr ++; code>
"Je n'ai pas encore réussi." Quel est l'échec? Vous avez manqué une information importante.