C#:结构体

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]

public struct Data

{

public int MessageID;

public double price;

public long number;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]

public string str;

//public char[] str;

/**

public Data(int i)

{

MessageID = 0;

price = 0.0;

number = 0;

str = new char[i];

}

* **/

}

http://rtx2005.blog.163.com/blog/static/85282552007112101729996/

public byte[] rawSerialize(object obj)
    {
      int rawsize = Marshal.SizeOf(obj);
      IntPtr buffer = Marshal.AllocHGlobal(rawsize);
      Marshal.StructureToPtr(obj, buffer, false);
      byte[] rawdatas = new byte[rawsize];
      Marshal.Copy(buffer, rawdatas, 0, rawsize);
      Marshal.FreeHGlobal(buffer);
      return rawdatas;
}

public BMTData rawDeserialize(byte[] rawdatas)
    {
      Type anytype = typeof(BMTData);
      int rawsize = Marshal.SizeOf(anytype);
      if (rawsize > rawdatas.Length)
        return new BMTData();
      IntPtr buffer = Marshal.AllocHGlobal(rawsize);
      Marshal.Copy(rawdatas, 0, buffer, rawsize);
      object retobj = Marshal.PtrToStructure(buffer, anytype);
      Marshal.FreeHGlobal(buffer);
      return (BMTData)retobj;
}

private void ReadStruct()
    {
      int currentLength = MemDB.GetLength();
      int currentCount = MemDB.GetCount();
      Byte[] data = new Byte[currentLength];
      MemDB.Read(ref data);
      BMTData item = rawDeserialize(data);
      String str = item.MessageID + "," + item.number + "," + item.price + "," + item.str;
      MessageBox.Show(str);
      lblUsedSize.Text = currentLength.ToString();
      lblCount.Text = currentCount.ToString();
      return;
}

private void btnTest_Click(object sender, EventArgs e)
    {
      MessageBox.Show(Marshal.SizeOf(typeof(BMTData)) + "");
       List<BMTData> datas = new List<BMTData>();
       BMTData item = new BMTData();
       item.MessageID = 1;
       item.number = 100;
       item.price = 1.2;
       item.str = "ABCD";

       datas.Add(item);
      /**
       String str = item.MessageID + "," + item.number + "," + item.price + ",";
       foreach(char ch in item.str)
        str += ch;
       str += "n";
      **/
       //lstData.Items.Add(str);
       byte[] bytData = rawSerialize(item);
       MemDB.Write(bytData,bytData.Length);

    }
}

时间: 2024-10-30 23:31:39

C#:结构体的相关文章

double类型结构体对齐的疑惑

问题描述 double类型结构体对齐的疑惑 32bit的cpu,在msvc中如果结构体有double类型,则以8字节对齐,例如 struct test { char ch; double j; }; ch也会占用8个字节,而32bit的cpu会一次性取到8个字节么?难道不是32bit,4个字节? 为什么要以8个字节来对齐呢?谢谢 解决方案 如果编译器为sse优化,那么是按照128bit,也就是8字节对齐的,如果编译器为sse2优化,那么是按照16字节对齐的.http://www.xuebuyua

Swift结构体与类

在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非常重视结构体,把结构体作为实现面向对象的重要手段.Swift中的结构体与C++和Objective-C中的结构体有很大的差别,C++和Objective-C中的结构体只能定义一组相关的成员变量,而Swift中的结构体不仅可以定义成员变量(属性),还可以定义成员方法.因此,我们可以把结构体看做是一种轻

C技巧:结构体参数转成不定参数

酷壳:http://coolshell.cn/articles/2801.html 下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏"__VA_ARGS__",下面这段程序可以在GCC下正常编译通过: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <stdio.h>    #define func(...) myfunc((struct

c语言-结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗

问题描述 结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗 结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗? 解决方案 如果是C++的结构体,可以在构造函数中赋值,比如 struct data { int a; data() { a = 1; } }; 解决方案二: 你动态分配了结构体变量无非是,后面的工作需要对它进行赋值,以及各种运算. 那么,你所说malloc初始化直接赋值.是指什么样的情况的,难道是像c++中的 (构造函数).事实上c++的构造函数在使用前

在C#里面调用带有回调函数和自定义结构体的DLL的例程

函数 开发环境: WinXP Pro(SP2英文版) + VS.NET 2003中文版接口库版本: CMPP2.0 API第二版(V2.6) 该例程演示了如何在C#里面调用VC6.0开发的带回调函数的API,而且回调函数的参数包含结构体,使用C#的委托和IntPtr方法实现. 由于我使用C#刚两天,这是我写的第一个C#程序,因此例程写的可能有点粗糙,但是编译和运行完全没有问题. CMPP2.0的API封装成了标准C调用的方法,提供以下三个接口,使用的时候只要有CMPPAPI.dll就可以了. #

Linux下的串口编程:struct termios结构体

termios结构体说明 termios结构体中,该结构体一般包括如下的成员: tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t     c_cc[NCCS]; 其具体意义如下 c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示. c_iflag参数表 键值说明 IGNBRK 忽略BREAK键输入 BRKINT 如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRK

关于C语言中的结构体对齐

(1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个. (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问.这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列. 举个例子

结构体数组的定义和引用(五)

2)指针法若p指向数组的某一个元素,则p++就指向其后续元素.3)指针的数组表示法若p=student,我们说指针p指向数组student,p[i]表示数组的第i个元素,其效果与student[i]等同.对数组成员的引用描述为:p[i].name.p[i].num等.[例7-4]指向结构体数组的指针变量的使用.structdata/*定义结构体类型*/{intday,month,year;};structstu/*定义结构体类型*/{char name[20];long num;struct d

结构体数组的定义和引用(四)

指针变量非常灵活方便,可以指向任一类型的变量,若定义指针变量指向结构体类型变量,则可以通过指针来引用结构体类型变量.7.3.1 指向结构体类型变量的使用首先让我们定义结构体:struct stu{char name[20];long number;float score[4];} ;再定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1.p 2,分别指向结构体类型变量.引用形式为:指针变量→成员:[例7-2] 对指向结构体类型变量的正确使用.输入一个结构

结构体数组的定义和引用(三)

第七步,定义m a i n ( )函数,列出完整的程序清单.#include #include struct stu{char name[20];long number;float score[4];} ;m a i n ( ){void input(); / *函数声明* /void aver();void order();void output();void out_row();struct stu stud[4]; / * 定义结构体数组* /float row[3];i n p u t