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

标签 c# arrays .net endianness

我正在尝试与我的计算机上本地运行的服务器进行通信。我只是不知道如何编写服务器期望的消息。我正在尝试在 .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.

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

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

我尝试过各种变体:

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

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

 //                           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 ) 存储库,它能够从该服务器进行通信和检索数据,但我无法按照它来理解如何使用 .Net 来做到这一点。也许它对于制定答案的人有用。

最佳答案

为了扩展 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 形式提供。

阅读您发布的文档后,“设置暂停”请求的预期数据如下所示:

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'

关于c# - 写入二进制多字节数组消息(大端)(.Net C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70659926/

相关文章:

c# - OpenXML:Excel,提取单元格文本和图像/图片数据

c# - 在 OpenRasta 处理程序中处理异常时,转换为响应的最佳方法是什么?

php - 从 var_export 中剥离数字数组键

arrays - 将2个数组放入perl中的散列中

c# - UploadStringAsync() 的返回值。?

c# - 从 List<> 获取特定项目

c# - 参数前的@符号是什么

c# - 静态构造函数是否作为 CER 运行?

c# - 如何为 Web API Controller 编写单元测试

arrays - Flash AS3,如何使用整数键索引 HashMap