Доступ и чтение массива char как массива int - PullRequest
0 голосов
/ 25 апреля 2020

Я не нашел никакого решения среди множества тем по этому поводу. Моя точная проблема:

У меня есть массив целых чисел, таких как unsigned int arr[2] = {0xFEBD1213, 0x1213FEBD};

Я хотел бы получить доступ к этим целым числам char с помощью char, что означает, что мне нужно прочитать: 0x13, 0x12, 0xBD, 0xFE, 0xBD, 0xFE, 0x13, 0x12. Я перепробовал много-много вещей, но пока не получилось.

Примечание. Я также хотел бы сделать обратное: иметь массив символов с размером, например size %4 == 0, и читать его как целочисленный массив. Например: unsigned char arr[8] = {0x13, 0x12, 0xBD, 0xFE, 0xBD, 0xFE, 0x13, 0x12} и читать 0xFEBD1213, 0x1213FEBD;

Есть ли способ сделать такую ​​вещь?

Минимальный воспроизводимый пример:

#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 ]

2 голосов
/ 25 апреля 2020

Простое смещение и AND будет работать:

#include <stdio.h>
#include <limits.h>

int main (void) {

    unsigned int arr[2] = {0xFEBD1213, 0x1213FEBD};

    for (size_t i = 0; i < 2; i++)
        for (size_t j = 0; j< sizeof *arr; j++)
            printf ("0x%hhx\n", arr[i] >> (j * CHAR_BIT) & 0xff);
}

Пример использования / Вывод

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

В go из байтов в массив просто сдвинуть противоположное направление и ИЛИ.

0 голосов
/ 25 апреля 2020

Вы можете использовать какой-то парсер:

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 голосов
/ 25 апреля 2020
#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;
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...