[英]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.