C# ();也可以使用,而且非常直接。@chris Char是一个Unicode字符。它不适合一个字节。强制转换为字节会导致InvalidCastException@chris对不幸的是,我是一个微优化器,所以我更喜欢预先调整数组的大小。。。您的调用将生成字节数
C# ();也可以使用,而且非常直接。@chris Char是一个Unicode字符。它不适合一个字节。强制转换为字节会导致InvalidCastException@chris对不幸的是,我是一个微优化器,所以我更喜欢预先调整数组的大小。。。您的调用将生成字节数,c#,c++,C#,C++,();也可以使用,而且非常直接。@chris Char是一个Unicode字符。它不适合一个字节。强制转换为字节会导致InvalidCastException@chris对不幸的是,我是一个微优化器,所以我更喜欢预先调整数组的大小。。。您的调用将生成字节数组的临时副本(在ToArray内部使用的私有集合中),然后它将成为byte[],因此需要两个副本。@xanatos在Linqpad中尝试“a”.Cast().ToArray()。它会扔Encoding.GetEncoding(“iso-8859
();也可以使用,而且非常直接。@chris Char是一个Unicode字符。它不适合一个字节。强制转换为字节会导致InvalidCastException@chris对不幸的是,我是一个微优化器,所以我更喜欢预先调整数组的大小。。。您的调用将生成字节数组的临时副本(在
ToArray
内部使用的私有集合中),然后它将成为byte[]
,因此需要两个副本。@xanatos在Linqpad中尝试“a”.Cast().ToArray()
。它会扔Encoding.GetEncoding(“iso-8859-1”)。另一方面,GetBytes(“å”)
将返回正确的值229
Encoding.ASCII
将返回63,用于失败转换的?
这似乎不太可能-您必须在数据中包含非ASCII值才能对其进行异或以设置高位。您是对的。这是原始版本中的一个错误,此处忘记更新。“\u01C”是一个字符,01C十六进制,“\u0001C”是两个字符,STX和“C”。当然谢谢你的努力!你说得对。这是原始版本中的一个错误,此处忘记更新。“\u01C”是一个字符,01C十六进制,“\u0001C”是两个字符,STX和“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;
}
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;
}
string result = Generate();
byte[] bytes = new byte[result.Length];
for (int i = 0; i < result.Length; i++)
{
bytes[i] = (byte)result[i];
}
foreach (byte b in Encoding.ASCII.GetBytes(data))
{
chk ^= b;
foreach (char ch in data)
{
chk ^= (byte)ch;
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