由于您可以控制结构,并且知道它有多少字段,因此应该很容易“按原样”发送字符串,但包括终止'\0'
字符,以便您知道一个字符串何时结束,下一个字符串何时开始(或消息结束最后一个字符串)。
在接收端,只需一次读取一个字符附加到正确的字段,当您收到一个为零的字符(不是'0'
文字值0
)时,您就知道一个字符串结束,下一个开始(或整个结构,如果您收到最后一个字符串)。
您可以使用它,因为不必事先分配 C# 字符串。另一种解决方案不是传输字符串终止符,而是首先发送一个包含字符串长度的固定大小的整数。
编辑:如果接收 C# 端的结构将字符串作为固定大小的字节数组,那么您仍然可以使用我提出的算法。一次读一个字符,然后做例如struct.buffer1[i++] = ch;
. 当数组已满,或者您收到字符串终止符时,重置计数器(i
在我之前的示例中)并开始接收下一个字符串。请记住,如果字符串比接收到的字符串长,您必须继续读取字符直到字符串结束,但只需丢弃它们。
我提到的另一个解决方案是,在每个字符串前面加上它的长度可能会更有效,最好的情况是你只需要在 C 端进行两次写入,在 C# 端进行两次读取。为了不必担心字节顺序,将长度作为固定长度的文本字段发送,例如发送字符串"foobar"
,您实际上发送两个字符串" 6"
和"foobar"
. 在接收端,首先读取四个字符,将字符串转换为整数,然后使用该值作为实际字符串的长度。