[英]converting unsigned char > 255 to int
我正在用PLC編程,我正在讀取它的價值。
它為我提供了unsigned char
的數據。 這很好,但我的PLC中的值可能超過255.由於無符號字符不能給出超過255的值,我得到錯誤的信息。
我從圖書館得到的結構:
struct PlcVarValue
{
unsigned long ulTimeStamp ALIGNATTRIB;
unsigned char bQuality ALIGNATTRIB;
unsigned char byData[1] ALIGNATTRIB;
};
ulTimeStamp
給出了時間 bQuality
給出真/假(能否讀取或不讀) byData[1]
給出了數據。 反正我現在嘗試此:(其中ppValues
是一個對象PlcVarValue
)
unsigned char* variableValue = ppValues[0]->byData;
int iVariableValue = *variableValue;
這很好用......直到ppValues[0]->byData
> 255;
當我嘗試以下數字時,例如257:
unsigned char testValue = ppValues[0]->byData[0];
unsigned char testValue2 = ppValues[0]->byData[1];
輸出為testvalue = 1
, testvalue2 = 1
這對我沒有意義。
所以我的問題是,我怎樣才能解決這個問題,以便給出正確的數字?
這實際上看起來像一個可變大小的結構,其中最后有一個大小為1
的數組是獲得它的常用方法。 參見例如本教程 。
在這種情況下,值257
兩個字節都是1
是正確的值。 將這兩個字節視為16位值,並將這些位組合在一起。 一個字節將成為高字節,其中1
對應於256
,然后添加低字節,即1
,你有256 + 1
,當然等於257
。 簡單的二進制算術
哪個字節是高,哪個是我們不能說的低,但很容易檢查是否可以強制包含值258
的消息,因為那時一個字節仍然是1
但另一個將是2
。
如果您知道按位移位和/或運算符,如何將它組合成單個無符號16位值也很容易:
uint8_t high_byte = ...
uint8_t low_byte = ...
uint16_t word = high_byte << 8 | low_byte;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.