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