MSCOMM二進位制模式讀取內容(中英混合)

ckkyjtqlt發表於2017-07-18

中文會被處理成2個位元組,需要自己合併起來。

從串列埠收到的位元組是GBK2312編碼型別

例如:中 編碼為 :D6D0

收到兩個位元組後,需要做強制轉換才能將編碼轉為中文

但是強制轉換前,需將兩個位元組調轉一下順序,因為發來的第一個位元組是高位位元組,第二個位元組是低位位元組,即收到的是AB,

如果直接合並後轉換的話,得不到原本意義的中文,這是因為將編碼強制轉換成字串時,低位是低位元組,高位是高位元組

例如 UINT型別  4位元組, 將其強制轉為char型,一個char佔一個位元組.一個4位元組的UINT型別會被處理成一個4位元組char型。因為UINT型別初始化為0(因為字串陣列末尾需要加空字元結尾),所以在這個4位元組陣列下得到一箇中文字元

var = m_comSearial.get_Input();

safeArray = var;
len = safeArray.GetOneDimSize();

UINT nTrail = 0;
UINT nCode = 0;
for (long k=0;k<len;k++)
{
safeArray.GetElement(&k,rxdata+k);



BYTE bt = *(BYTE*)(rxdata+k);
if (nTrail == 0 && _ismbblead(bt))
{
nTrail = bt;

continue;
}
else if(nTrail > 0 && _ismbbtrail(bt))
{



nCode = bt;
nCode = nCode << 8;
nCode+=nTrail;
nTrail = 0;
char *p = (char*)&nCode;


int nNumber = MultiByteToWideChar(CP_ACP,0,p,-1,NULL,0);
WCHAR *psz = new WCHAR[nNumber];
MultiByteToWideChar(CP_ACP,0,p,-1,psz,nNumber);
strTemp+=psz;
delete []psz;
}
else
{
strTemp.Format(_T("%c"),bt);
}

nCode = 0;
m_strrecv+=strTemp;
strTemp.Empty();


}

相關文章