通过socket API将C struct传输到C#struct

通过socket API将C struct传输到C#struct,c#,c,sockets,C#,C,Sockets,我有一个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#socket

我有一个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#sockets中接收字节类型的数据。你知道吗?

既然你控制着这个结构,并且知道它有多少字段,那么按原样发送字符串应该很容易但要包含终止的
“\0”
字符,以便您知道一个字符串何时结束,下一个字符串何时开始(或最后一个字符串的消息何时结束)

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

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

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


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

所有这些
char*
s是否表示以零结尾的字符串?它们的编码是什么?ANSI、ASCII、UTF-8?是的,请想象它们是类似于[constant size]的数组一个常量数组,以零结尾的字符串是不同的东西。那是哪一个呢?您也没有回答编码问题。我编辑了问题,请删除负VOT请想象它们是类似于[constant size]的数组@Robustics更新了我的答案