[英]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 位二進制補碼值的四個選項是:
int16_t
: uint16_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);
.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;
.int16_t result = ((highbyte ^ 128) - 128) * 256 + lowbyte;
.int16_t result = (int16_t) ((uint16_t) highbyte << 8 | lowbyte);
. (最后,到int16_t
的轉換隱含在初始化中,但使用了強制轉換,因為如果沒有它,一些編譯器會產生警告或錯誤,具體取決於開關。)
注意: int16_t
和uint16_t
是通過包含<stdint.h>
來定義的。 或者,如果給定short
是 16 位,則可以使用short
和unsigned short
代替int16_t
和uint16_t
。
這里是關於前三個的更多信息。
(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
中產生所需的排列。
) { } 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
初始化為此值。
這里我們分別從更高位字節開始,將高字節的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.