簡體   English   中英

如何在兩個不同的數組位置組合兩個十六進制值(高值和低值)?

[英]How to combine two hex value(High Value & Low Value) at two different array positions?

我收到兩個十六進制值,其中 array[1] = lowbyte 和 array[2] = highbyte,對於我的示例,lowbyte = 0xF4 和 highbyte = 0x01,因此該值將在我的示例中為 1F4(500)。 所以我想合並這兩個值並進行比較,但是如果沒有任何庫 function,我該怎么做呢?

請幫忙,對不起我的英語不好。

我做了一些研究,發現這是我的解決方案,而且似乎工作正常:

int temp = (short)(((HIGHBYTE) & 0xFF) << 8 | (LOWBYTE) & 0xFF);

只是一個基本示例,展示了如何將兩個不同變量的值合並為一個:

#include <stdio.h>

int main (void)

{
  char highbyte = 0x01;
  unsigned char lowbyte = 0xF4; //Edited as per comments from @Fe2O3, 
  short int val = 0;

  val = (highbyte << 8) | lowbyte; // If lowbyte declared as signed, then masking is required `lowbyte & 0xFF`
  printf("0x%hx\n", val);
  return 0;

}

在 Linux PC 上進行了測試。

根據您轉換為 short 的答案,您似乎希望將兩個字節組合起來產生一個 16 位二進制補碼 integer。此答案顯示了如何以三種方式執行此操作,其行為完全由 C 定義標准,以及第四種方式,需要了解正在使用的 C 實現。 C++中也定義了方法1和3。

給定兩個八位無符號字節,高位字節在highbyte中,低位字節在lowbyte中,構造它們表示的 16 位二進制補碼值的四個選項是:

  1. 按所需順序組裝字節並將它們復制到int16_tuint16_t t = (uint16_t) highbyte << 8 | lowbyte; int16_t result; memcpy(&result, &t, sizeof result); uint16_t t = (uint16_t) highbyte << 8 | lowbyte; int16_t result; memcpy(&result, &t, sizeof result); .
  2. 按所需順序組裝字節並使用聯合重新解釋它們: int16_t result = (union { uint16_t u; int16_t i; }) { (uint16_t) highbyte << 8 | lowbyte }.i; int16_t result = (union { uint16_t u; int16_t i; }) { (uint16_t) highbyte << 8 | lowbyte }.i; .
  3. 算術構造結果: int16_t result = ((highbyte ^ 128) - 128) * 256 + lowbyte; .
  4. 如果給出的代碼將僅與 C 實現一起使用,該實現定義轉換為帶符號的 integer 以換行,則可以使用轉換: int16_t result = (int16_t) ((uint16_t) highbyte << 8 | lowbyte); .

(最后,到int16_t的轉換隱含在初始化中,但使用了強制轉換,因為如果沒有它,一些編譯器會產生警告或錯誤,具體取決於開關。)

注意: int16_tuint16_t是通過包含<stdint.h>來定義的。 或者,如果給定short是 16 位,則可以使用shortunsigned short代替int16_tuint16_t

這里是關於前三個的更多信息。

1.組裝字節並復制

(uint16_t) highbyte << 8 | lowbyte (uint16_t) highbyte << 8 | lowbyte轉換為適合移位而沒有符號位問題的類型,將較高有效字節移動到 16 的高 8 位,並將較低有效字節放入低 8 位。

然后uint16_t = …; 將這些位放入uint16_t

memcpy(&result, &t, sizeof result); 將這些位復制到int16_t中。 C 2018 7.20.1.1 1 保證int16_t使用二進制補碼。 C 2018 6.2.6.2 2 保證 int16_t 中的值位與uint16_t中的對應值具有相同的int16_t值,因此副本在result中產生所需的排列。

2.組裝字節並使用聯合

) { } is a compound literal . ( ) { }復合文字 (union { uint16_t u; int16_t i; }) { (uint16_t) highbyte << 8 | lowbyte } (union { uint16_t u; int16_t i; }) { (uint16_t) highbyte << 8 | lowbyte }創建一個作為聯合的復合文字,並將其u成員初始化為具有上述值。 然后.i讀取聯合的第i個成員,它使用int16_t類型重新解釋位,如上所述,它是二進制補碼。 然后int16_t result = …; result初始化為此值。

3.算術構造結果

這里我們分別從更高位字節開始,將高字節的highbyte解釋為二進制補碼。 在八位二進制補碼中,符號位表示關閉時為 0,打開時表示 -128。 (例如,11111100 2作為無符號二進制表示 128+64+32+16+8+4 =252,但是,在二進制補碼中,它是 −128+64+32+16+8+4 = −4。)

考慮highbyte ^ 128) - 128 如果第一位關閉, ^ 128將其打開,這會將 128 添加到其無符號二進制含義中。 然后- 128減去 128,產生零的凈效應。 如果第一位打開, ^ 128將其關閉,從而取消其無符號二進制含義。 然后- 128給出了所需的值。 因此(highbyte ^ 128) - 128將第一個位重新解釋為值為 0(如果它關閉)和 -128(如果它打開)。

然后((highbyte ^ 128) - 128) * 256將其移動到 16 位的高位字節(此時為int類型), + lowbyte lowbyte 將低位字節放入低位 position。當然還有int16_t result = …; result初始化為此計算值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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