簡體   English   中英

將unsigned char> 255轉換為int

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

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