-1

我在 C 中有一个结构

    typedef struct config
{
    char terminal_id[4];
    char update_version[6];
    char sub_app[6];
    char day[6];
    char month[6];
    char year[6];
    char hours[6];
    char minutes[6];

};

我想将用 C 编写的配置数组(如上)传输到 C# 中的结构,我只有在 C# 套接字中接收字节类型的数据。知道吗?

4

1 回答 1

0

由于您可以控制结构,并且知道它有多少字段,因此应该很容易“按原样”发送字符串,但包括终止'\0'字符,以便您知道一个字符串何时结束,下一个字符串何时开始(或消息结束最后一个字符串)。

在接收端,只需一次读取一个字符附加到正确的字段,当您收到一个为零的字符(不是'0'文字值0)时,您就知道一个字符串结束,下一个开始(或整个结构,如果您收到最后一个字符串)。

您可以使用它,因为不必事先分配 C# 字符串。另一种解决方案不是传输字符串终止符,而是首先发送一个包含字符串长度的固定大小的整数。

编辑:如果接收 C# 端的结构将字符串作为固定大小的字节数组,那么您仍然可以使用我提出的算法。一次读一个字符,然后做例如struct.buffer1[i++] = ch;. 当数组已满,或者您收到字符串终止符时,重置计数器(i在我之前的示例中)并开始接收下一个字符串。请记住,如果字符串比接收到的字符串长,您必须继续读取字符直到字符串结束,但只需丢弃它们。

我提到的另一个解决方案是,在每个字符串前面加上它的长度可能会更有效,最好的情况是你只需要在 C 端进行两次写入,在 C# 端进行两次读取。为了不必担心字节顺序,将长度作为固定长度的文本字段发送,例如发送字符串"foobar",您实际上发送两个字符串" 6""foobar". 在接收端,首先读取四个字符,将字符串转换为整数,然后使用该值作为实际字符串的长度。

于 2012-07-27T07:02:16.047 回答