C++结构struct st
{
  int ivalue1;//长度=4
  char cvalue2[4];//长度=4
}struct stEx
{
  int ivalue1;//4
  st  stvalue2;//8
}
在C#NET里怎样计算里面存储的长度,并根据这个结构可以反序列化.目前我用的是序列化长度是有问题的.

解决方案 »

  1.   

    哦.现在问题是用户给我一个包结构.我要按要求去处理对应数据.C++处理没有问题.现在转到NET里就对不上了.
      

  2.   

    哦.那只有自己实际BUF操作了是吧.先试试...如果有朋友可现场写两段是最好的..嘿嘿.本人什么没学会就是学会懒.
      

  3.   

    太麻烦了..想了几个小时,不是长度问题就是字符转换问题.
    用Encoding.Default取出的长度正确.
    Marshal.SizeOf取的包大小正确.
    string to byte网上查到一个.转换的长度不正确.没折.
      

  4.   

    如果是发过来的包结构,那就把C#端的结构定义为unsafe的,按字节对齐,char   cvalue2[4]要定义成fixed byte cvalue2[4],然后就可以像C++一样用指针来操作这个结构了
      

  5.   

    磨了一天.还没是出来....我用VC传的数据显示正确,确C#NET老是少几个汉字.我在NET把BYTE转过来又是正确的.哪里问题呀??
    代码如下:
            unsafe public struct Head
            {
                public uint dw1;
                public uint dw2;
                public fixed byte ExCode[8];
            }
                Head head = new Head();
                //byte[] bt = new byte[8];
                //bt = Encoding.Default.GetBytes("1");
                //fixed (head.ExCode = bt)
                //fixed (byte* pbt = bt)
                //head.ExCode = pbt;
                head.dw1= (uint)IPAddress.HostToNetworkOrder(SendCmd);
                head.dw2= (uint)IPAddress.HostToNetworkOrder(SendContent.Length);            int hdlen = Marshal.SizeOf(head);
                int conlens = Encoding.Default.GetBytes(SendContent).Length;
                byte[] contentbuf = Encoding.Default.GetBytes(SendContent);
                
                byte[] line = new byte[hdlen];
                for (int i = 0; i < Marshal.SizeOf(head); i++)
                {
                    line[i] = Marshal.ReadByte(head, i);
                }            sendbuf = new byte[hdlen + conlens];
                LinkByte(line, contentbuf, ref sendbuf);//SENDBUF就是要提交出去的数据
    //NET反过来除了头有16位长取消.取包体显示字符
                byte[] strbuf = new byte[sendbuf.Length - 16];
                SubByte(ref strbuf, sendbuf, 16, strbuf.Length);
                return Encoding.Default.GetString(strbuf);//NET显示正常//还有一个问题就是FIXED结构里的public fixed byte ExCode[8];数据怎样赋值.
    //刚测试结果显示,NET里传汉字过去就会少字...传两个汉字要少一个汉字.传字符就正确
      

  6.   


    Console.WriteLine(Marshal.SizeOf(new st()).ToString());
      

  7.   

    public   fixed   byte   ExCode[8]不能直接赋值,要用数组复制,少汉字是不是你忘了汉字占两个字节?接收时,用这个Head的指针指向vc传回来的buf的首地址,就可以用了
      

  8.   

    应该不是汉字占两个字节的关系吧.我用VC测试过包长度和NET一样大小发送.可能是NET的转换汉字占位不一样吧.不过现在还没有找到答案.
    如果按NET加长的话,我就怕服务端接收不可识别.
      

  9.   

    Encoding.Default.GetBytes(SendContent); 取出来的数值是占两个字符的.
    Encoding.Default.GetBytes(SendContent).Length; 长度也应该是正确的.
    字节也数据都正确.就是到对方要少字符...为什么?VC和NET的存放BYTE有什么不同吗?
      

  10.   

    一样的,我做过C#和C++程序交互数据的系统,就是用上面的方式。
    你那个struct 要加上一个属性:
    [StructLayout(LayoutKind.Sequential , Pack=1, CharSet=CharSet.Ansi)]