0
votes

Accès et lire un tableau de charme en tant que tableau Int

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 non signé int arr [2] = {0xfebd1213, 0x1213febd}; code> p>

Je voudrais accéder à ces entiers Char par Char, ce qui signifie que j'ai besoin de lire: 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>

Remarque: je voudrais aussi faire le contraire: avoir un tableau de charcuterie avec une taille telle que 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>

y a-t-il un moyen de faire une telle chose? p>

Exemple reproductible minimal: P>

#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++);
  }
}


2 commentaires

pTR = (ptr + i); ==> ptr ++;


"Je n'ai pas encore réussi." Quel est l'échec? Vous avez manqué une information importante.


3 Réponses :


2
votes

Un simple décalage et travaillera: xxx pré>

Exemple Utilisez / sortie STROND> P>

$ ./bin/arrbytes
0x13
0x12
0xbd
0xfe
0xbd
0xfe
0x13
0x12


4 commentaires

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 sur une petite machine Endian, votre commande serait 13 , 12 , BD , Fe (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; 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.



-1
votes
#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;
  }
}


2 commentaires

Ne postez pas le code sans explication où l'erreur était.


PTR = & * (PTR) +1; est affreux.



0
votes

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++;  
    }
}


0 commentaires