我在 c# 中有一个结构,有两个成员:
public int commandID;
public string MsgData;
我需要将这两个转换为一个单字节数组,然后将其发送到将解包字节的 C++ 程序,它将获取第一个 `sizeof(int) 字节以获取 commandID,然后将使用 MsgData 的其余部分.
在 c# 中执行此操作的好方法是什么?
我在 c# 中有一个结构,有两个成员:
public int commandID;
public string MsgData;
我需要将这两个转换为一个单字节数组,然后将其发送到将解包字节的 C++ 程序,它将获取第一个 `sizeof(int) 字节以获取 commandID,然后将使用 MsgData 的其余部分.
在 c# 中执行此操作的好方法是什么?
下面将只返回一个常规的字节数组,前四个代表命令 ID,其余代表消息数据,ASCII 编码和零终止。
static byte[] GetCommandBytes(Command c)
{
var command = BitConverter.GetBytes(c.commandID);
var data = Encoding.UTF8.GetBytes(c.MsgData);
var both = command.Concat(data).Concat(new byte[1]).ToArray();
return both;
}
Encoding.UTF8
例如,如果您愿意,您可以切换出去Encoding.ASCII
——只要您的 C++ 使用者可以解释另一端的字符串。
这直接进入一个字节数组。
public byte[] ToByteArray(int commandID, string MsgData)
{
byte[] result = new byte[4 + MsgData.Length];
result[0] = (byte)(commandID & 0xFF);
result[1] = (byte)(commandID >> 8 & 0xFF);
result[2] = (byte)(commandID >> 16 & 0xFF);
result[3] = (byte)(commandID >> 24 & 0xFF);
Encoding.ASCII.GetBytes(MsgData.ToArray(), 0, MsgData.Length, result, 4);
return result;
}
这会给你byte[]
你想要的。这里要注意的一件事是我没有使用序列化程序,因为你想要一个非常原始的字符串,并且没有序列化程序(我知道)可以像你想要的 OOB 一样序列化它。然而,这是一个如此简单的序列化,这更有意义。
var bytes = Encoding.UTF8.GetBytes(string.Format("commandID={0};MsgData={1}", o.commandID, o.MsgData));
最后,如果您有更多我不知道的属性,您可以使用反射。