编写二进制多字节数组消息(大端)(.Net C#)

Writing a binary multi-byte array message (big endian) (.Net C#)

我正在尝试与我机器上的本地服务器 运行 通信。我只是不知道如何编写服务器期望的消息。我正在尝试在 .Net 应用程序 (C#) 上执行此操作。此服务器需要至少 10 字节的消息,消息按以下结构排列,来自 manual:

[完整手册]http://jkca.ca/help/pages/telemetry.html#messageformat

Each message has the same basic binary format. All multi-byte values are in network-byte-order (big-endian)!! The minimum message size is 10 bytes. Clients are allowed to send Client Request messages (see Message Type Table). The server will respond with corresponding Server Reply messages. The Request ID can be freely assigned by the client and has no special meaning. The server's reply message will use the same Request ID in the corresponding answer.

(我似乎无法在这个问题中格式化 table 所以我省略了可以在手册中找到的 table)

我想了解如何形成这些消息。如果有人可以向非 CS 学生解释如何形成,例如,发送“暂停命令”(http://jkca.ca/help/pages/telemetry.html#msg27) 的消息,那将非常有用。

我试过各种变体:

string message = N + "27" + "1000" + "01" + "1" + L;
Byte[] data = System.Text.Encoding.BigEndianUnicode.GetBytes(message);

and(我意识到这不是二进制的)

 //                           N  |Type ID(2) |     ID (4)            |Datasize(2)|Data |  L    |  
 //Byte[] data = new Byte[] { 0x4E, 0x32, 0x37, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x4C };
 //                           N  |  2  |  7  |  1  |  0  |  0  |  0  |  0  |  1  |  1  |  L    |

并使用

发送数据
stream.Write(data, 0, data.Length);

或者,解释如何请求“软件版本”以及如何阅读回复 (http://jkca.ca/help/pages/telemetry.html#msg3) 可能是我开始理解如何执行此操作所需的全部内容。

非常感谢。

PD:我在 python 中找到了这个 (https://github.com/bestdani/py_nl2telemetry) 存储库,它设法从该服务器通信和检索数据,但我无法理解如何使用。网。也许它对起草答案的人有用。

为了扩展 Hans 的评论,字符串文字中的每个字母通常等于一个字节。例如。 A 存储为 0x41B 存储为 0x420 存储为 0x30。搜索 ASCII 和 UTF8 字符编码以获取更多信息。当你写一个像 '1000' 这样的字符串,然后获取底层字节时,你会得到序列 0x31 0x30 0x30 0x30。这里的字节数等于你的字符串中的位数。这是一个可变长度的数字,它不是一种非常紧凑的信息存储方式,因为它没有使用每个字节的全部范围(00 到 FF)来实现每个字节总共 256 种可能性,它只使用了 10可能性(30 到 39)。当您使用更大的数字时,这种低效率变得更加明显,例如1000000占7个字节

服务器需要不同格式的请求 ID,int32,它总是占用 4 个字节。您可以通过调用 BinaryPrimitives.WriteInt32BigEndian(buffer, 1000) 将数据转换成这种格式。这同样适用于消息类型 ID 和数据大小字段,它们应作为 Int16 提供。

阅读您发布的文档后,'Set Pause' 请求的预期数据看起来像这样:

0x4E 'N'
------------------------
0x00 Set Pause (27)
0x1B
------------------------
0x00 Request id (1000)
0x00
0x03
0xE8
------------------------
0x00 Data size (1)
0x01
------------------------
0x01 Data (Enable pause)
------------------------
0x4C 'L'