将指针转换为连接

时间:2016-02-15 09:14:00

标签: c arrays pointers casting

我的C-Embedded软件有点问题。实际上我想在整数指针上转换一个char指针,但是我遇到了一些问题......

实际上我填充了一个char表,想在整数变量中读取这个缓冲区。演员是否允许将4-char连接到一个整数?

示例:

char tab[4] = {0x01,0x02,0x03,0x04};

我希望得到一个包含值0x01020304的整数。我试图这样做,但我没有得到想要的价值:

val_int =*((int*)tab);
你可以给我一些建议吗?是否必须将每个单元格转换一次?

5 个答案:

答案 0 :(得分:3)

不依赖于平台的耐用性:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

typedef union
{
  uint32_t val32;
  uint8_t  val8 [sizeof(uint32_t)];
} val_t;


int main (void)
{
  val_t v = {.val8 = {0x01,0x02,0x03,0x04} };

  printf("%.8" PRIx32, v.val32);

  return 0;
}

答案 1 :(得分:3)

你不能写这样的代码,因为它违反了"strict aliasing" rule。简单地说,这就决定了编译器可以自由地假设你的字符数组永远不会通过指向int的指针来访问。因此,编译器可能会优化掉大部分代码。

例如,它可能决定程序从不使用整个char数组并将其完全删除。因此,代码的结果具有未定义的行为。

话虽如此,即使您的代码按预期工作,它仍然会依赖于endianess。如果无关紧要的是可移植性/字节顺序,那么你可以使用一个union,它可以使代码安全地防止指针别名错误:

@Html.RadioButtonFor

答案 2 :(得分:1)

您可以使用$scope.$apply 这表明可以通过不同类型访问数据:

#include <stdio.h>
#include <stdlib.h>

union data{
    int i;
    char arr[4];
};

int main()
{
    union data d;
    d.arr[0] = 0x01;
    d.arr[1] = 0x02;
    d.arr[2] = 0x03;
    d.arr[3] = 0x04;

    printf("the value: %#010x\n", d.i); //outputs 0x4030201 on my little endian computer

    return 0;
}

另请注意C union这可能会使您的结果看起来与您预期的顺序不同。

答案 3 :(得分:0)

在Little Endian机器上,可以进行转换,但是你必须以相反的方式重新组织你的初始char数组以获得预期的结果。这是X86上的一个例子:

char tab[] = {0x04,0x03,0x02,0x01};
unsigned int *p_int = ( unsigned int * )tab;
printf( "val = 0X%X \n", *p_int );

答案 4 :(得分:0)

还有另外一个问题(除了已经提到的)在嵌入式上可能会出现类似的代码。

在某些平台上,读取(和写入)指令需要与读取(写入)的数据大小对齐,即8位读取未对齐,16位读取与2字节边界对齐,以及32位read与4个字节对齐。

当您分配字节数组时,它的开头根本不对齐(因为它们是字节),但是当您将其转换为unlist(lapply(xs, `[[`, 'x')) #[1] b y y i z o q w p d f f z b h m c u f s j e i v y b w j n q e w i r h p z q f x a b v z e x l c q f #Levels: b d i o p q w y z c f h m s u e j n v r x a l 并读取它时,将使用32位读取指令。

结果,你会随机崩溃。