gpt4 book ai didi

从 C++ 转换的 C# 代码不起作用

转载 作者:行者123 更新时间:2023-11-27 23:45:48 30 4
gpt4 key购买 nike

考虑以下通过 RS232 将数据发送到设备的 C++ 代码。

  strcpy(m_MsgBytes, "SRT1");

iTmp = finalizeNL20Message(m_MsgBytes, 4);

int CVTSSLTNL20Message::finalizeNL20Message(BYTE *pMsgData, int iInLen)
{
BYTE ucMsg[MAX_MESSAGE_LENGTH];

ucMsg[0] = MSG_STX; // 0x02
ucMsg[1] = NL20_BLOCK_ID; // ox01
ucMsg[2] = ATTR_CMD; // 'C'

memcpy(&ucMsg[3], pMsgData, iInLen);

ucMsg[3 + iInLen] = MSG_ETX;
ucMsg[4 + iInLen] = calculateNL20Checksum(ucMsg, 4 + iInLen);
ucMsg[5 + iInLen] = MSG_CR;
ucMsg[6 + iInLen] = MSG_LF;

memcpy(pMsgData, ucMsg, 7 + iInLen);

return 7 + iInLen;
}

BYTE CVTSSLTNL20Message::calculateNL20Checksum(const BYTE *pData, int iInLen)
{
BYTE ucChk = 0;

for (int iCnt = 0; iCnt < iInLen; iCnt++)
ucChk = ucChk ^ pData[iCnt];

return ucChk;

}

我用 C# 重写了这段代码,如下所示:

public static string Generate()
{
return RIONNLHelper.FinalizeMessage("SRT1");
}

public static string FinalizeMessage(string data)
{
//STX=0x02 NL20BLOCKID=0x01 Command=C (Command from computer)
data = "\x02\x01C" + data;

//ETX=0x03
data += "\x03";
data += (char)calculateNL20CheckSum(data);
data += "\r\n";

return data;
}

public static byte calculateNL20CheckSum(string data)
{
byte chk = 0;

foreach (byte b in Encoding.ASCII.GetBytes(data))
{
chk ^= b;
}

return chk;
}

并且在发送之前将字符串转换为字节数组

bytes = data.Select(c=>(byte)c).ToArray();现在的问题是,C# 代码永远不会收到设备对这些请求的响应。它确实会发回其他数据,所以波特率和所有这些都是正确的。

我对从 C++ 代码翻译缓冲区有一些疑问。 0x020x01C 数据 0x03 校验和\r\n

成为

\x02\x01C数据\x03校验和\r\n

否则校验和计算的重写是否正确?先计算字节的校验和,然后转换回char

最佳答案

这很奇怪。一如既往,我创建了一个单元测试。然后我使用 C++ CLR 构建了 C++ 版本,并进行了将输出与输入“SRT1”进行比较的测试。最初,它失败了

C++ version:  02 01 43 53 52 54 31 03 27 0d 0a 
C# version: 02 1c 53 52 54 31 03 79 0d 0a

那个1C有点眼熟……

错误似乎是在假设字符串 "\x02\x01C"+ data;与 "\x02"+ "\x01"+ "C"+ data; 相同,而十六进制转义符将继续解释数字,直到它找到一个不是十六进制数字的字符。所以“C”成为十六进制转义的一部分。

分解文字允许解析器将“C”解析为单独的字符,然后单元测试通过。

关于从 C++ 转换的 C# 代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50695969/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com