我的C-Embedded软件有点问题。实际上我想在整数指针上转换一个char指针,但是我遇到了一些问题......
实际上我填充了一个char表,想在整数变量中读取这个缓冲区。演员是否允许将4-char连接到一个整数?
示例:
char tab[4] = {0x01,0x02,0x03,0x04};
我希望得到一个包含值0x01020304
的整数。我试图这样做,但我没有得到想要的价值:
val_int =*((int*)tab);
你可以给我一些建议吗?是否必须将每个单元格转换一次?
答案 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位读取指令。
结果,你会随机崩溃。