[英]Extract 2nd and 3rd value from char array and cast it as short (2 bytes). In C
说我有一个无符号字符(或字节)数组。 我想从内存中获取array [1]和array [2]并将其强制转换为short int(2个字节)。 与联合的工作方式类似,但不是从第一个字节开始。
例:
#include <stdio.h>
void main()
{
unsigned char a[28];
unsigned short t;
a[0]=12;
a[1]=10;
a[2]=55;
t=(short) *(a+1);
printf("%i", t);
}
我想要的是十进制值14090。 或370Ah。
谢谢。
编辑:我忘了说,但是你们中的大多数人都从我的例子中了解到,我正在使用低端字节序的计算机。 8位Atmel微控制器。
很简单:
unsigned short t = (a[2] << 8) | a[1];
注意,这假定unsigned char
为8位,这很可能是这种情况。
内存访问操作(short)*(a+1)
不安全。
如果a+1
不与short
对齐(即a+1
不是sizeof short
的倍数),则此操作的结果取决于手边的编译器。
支持不对齐的加载/存储操作的编译器可以正确地对其进行解析,而其他编译器会将其“舍入” 为与short
对齐的最近地址。
通常,此操作会产生未定义的行为。
在最严重的是,即使你确实知道a+1
对准 short
,这种操作还是会给予你大端架构和little-endian架构之间不同的结果。
这是解决两个问题的安全方法:
short x = 0x1234;
switch (*(char*)&x)
{
case 0x12: // Big-Endian
t = (a[1] << 8) | a[2]; // Simulate t = (short)*(a+1) on BE
break;
case 0x34: // Little-Endian
t = (a[2] << 8) | a[1]; // Simulate t = (short)*(a+1) on LE
break;
}
请注意,上面的代码假定以下内容:
CHAR_BIT == 8
sizeof short == 2
这不一定在每个平台上都适用(尽管多数情况下是这样)。
t= *(short *)(a+1);
您将指向第一个元素的指针转换为短指针,然后取消引用。
请注意,这不是便携式的,如果计算机使用大字节序或以某种方式对齐数据,则可能会出错。 更好的方法是:
t = (a[2] << CHAR_BIT) | a[1];
为了实现完全的可移植性,您应该检查字节序,并查看要移位的字节,以及不移位的字节。 在这里查看如何检查机器的字节序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.