簡體   English   中英

從char數組中提取2nd和3rd值,並將其強制轉換為short(2個字節)。 在C中

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM