我正在与Wince 6.0嵌入式设备通信,并通过c / c ++代码读/写一些数据。现在我使用下面的代码片段来读/写com端口。
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = ((iValue >> 24) & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+3] = (iValue & 0xFF);
}
ReadWriteDataThread()
{
BYTE ucInitMsg[32] = {0};
ucInitMsg[0] = 0x0A;
ConvertIntToByte(iUTCTime, ucInitMsg, 1);
ucInitMsg[21] = 0x02;
ucInitMsg[22] = 0x3E;
ucInitMsg[31] = 0xCA;
m_objComm.WriteCommPort(ucInitMsg, 32); //Its a standard comm port write function which used WriteFile windows API
}
现在,我担心的是我是否以正确的方式将字节写入com端口?我在位移中做得对吗?我在网上找到了int到字节转换的代码,我在位/字节操作方面不是很强。
在我知道我的平台是小端之后,我将Byte转换的例程改为下面。有人可以验证吗?
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
ucRawBuffer[iOffset+2] = (iValue >> 16) & 0xFF;
ucRawBuffer[iOffset+3] = (iValue >> 24) & 0xFF;
}
void ConvertShortToByte(short iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
}
答案 0 :(得分:1)
简短回答:ConvertIntToByte()看起来没问题,但无论运行的平台是小端还是大端,它都会产生“线上”的大端。如果这个“电线上的大端”是您所需要的 - 取决于目标设备/协议要求。
答案很长:
上面的代码不依赖于任何演员阵容;它使用的所有操作都是与字节顺序无关的操作(例如,无论字节顺序如何,i>> 8的数字结果总是相同的,并且>>通常与字节顺序无关,与任何其他算术或按位运算一样) ,因此它将在任何平台上产生相同的结果,无论是小端还是大端。
由于编写代码的方式,即使在little-endian系统上运行,它也会在线上产生大端。因此,剩下的问题是“设备的预期目标是什么 - 大端或小端”。如果目标设备需要little-endian,那么代码应该重写为:
ucRawBuffer[iOffset] = (iValue & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+3] = ((iValue >> 24) & 0xFF);