【问题标题】:Access and read a char array as an int array以 int 数组的形式访问和读取 char 数组
【发布时间】:2020-04-25 17:38:03
【问题描述】:

我在许多关于此的线程中没有找到任何解决方案。 我的确切问题是:

我有一个整数数组,例如unsigned int arr[2] = {0xFEBD1213, 0x1213FEBD};

我想逐个字符地访问这些整数,这意味着我需要阅读: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++);
  }
}

(我知道有很多更简洁的编码方式,但我无法控制给定数组的类型)

【问题讨论】:

  • ptr = (ptr + i); ==> ptr++;
  • “我还没有成功。”失败是什么?您错过了一个重要信息。

标签: c pointers memory


【解决方案1】:

一个简单的转变和 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

要从字节转到数组,只需移动相反的方向和 OR。

【讨论】:

  • 这不是我所需要的。我需要一个指针变量,我可以从中遍历数组。不过,谢谢你的回答。我在上面发布了我的解决方案。
  • 爱它。很优雅
  • @jijuji 使用指针的问题是它没有考虑字节序。如果您要在小端机器上简单地迭代 0xFEBD1213 中的字节,您的排序将是 1312BDFE(其中 LSB 首先存储在内存中)。当您使用移位时,编译器会适当地处理字节顺序。尝试使用unsigned char *p = (unsigned char *)arr;,然后使用for (; p != (unsigned char*)&amp;arr[0] + sizeof arr; p++) 进行迭代——您的字节顺序在LE 上是相反的。
  • @DavidC.Rankin 这正是我所需要的,它可以保持字节序。
【解决方案2】:

您可以使用某种解析器:

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

【讨论】:

    【解决方案3】:
    #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;
      }
    }
    
    

    【讨论】:

    • 不要在没有说明错误所在的情况下发布代码。
    • ptr = &amp;*(ptr)+1; 太糟糕了。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多