对一老问题又犯蒙了,好像是说在非托管内存里当charset.Ansi时Marshal.SizeOf(typeof(char))的大小是1,可是实在没想明白如果char是一个汉字,一个字节的空间如何够存呢
谁有相关资料推荐偶看看,baidu一阵没什么收获

解决方案 »

  1.   

    gb2312编码中
    一个汉字拆成2个ansi char了
      

  2.   

    举个例子吧using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;namespace MarshalTest
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        struct B
        {
            public char c1;
            public byte d1;
            public int i1;
            public double c2;
            public bool b1;
        }
        unsafe class c
        {
            public static void Main(string[] args)
            {            B b = new B();
                b.c1 = 'a';
                b.d1 = 8;
                b.i1 = 1;
                b.c2 = 3.4;
                b.b1 = false;            IntPtr buffer = IntPtr.Zero;
                buffer = Marshal.AllocHGlobal(Marshal.SizeOf(b));
                Marshal.StructureToPtr(b, buffer, true);
                Console.WriteLine(*((char*)buffer));//-------------------------  question
                Console.WriteLine(*((byte*)((byte*)buffer + 1)));
                Console.WriteLine(*((int*)((byte*)buffer + 2)));
                Console.WriteLine(*((double*)((byte*)buffer + 6)));
                Console.WriteLine(*((bool*)((byte*)buffer + 14)));
            }
        }
    }这段代码都打印正常,就是question那行输出的是?
    为什么呢
      

  3.   

    你加上这个                byte[] buf = Encoding.Unicode.GetBytes(new char[] { 'a' });
                    Console.WriteLine(buf[0]);
                    Console.WriteLine(buf[1]);你就发现,它把双字节的低位给写进去了而已,所以不能这么写(b.c1 = 'a';)
    赋值时要用Encoding进行转换
      

  4.   

    lake_cx 兄所言差异,如何把托管内存的数据安全的传递到非托管内存中StructureToPtr已经很好的为我们保证了之所以读出?是我读取非托管内存的方法错了
    试把这行代码
    Console.WriteLine(*((char*)buffer));
    改成
    Console.WriteLine((char)*((byte*)buffer));
    就能看到打印出'a'了感谢大家回答,summit
      

  5.   

    刚刚再试了一下,确实像你说的,如果char中有中文之类的无法存放到一个字节中的
    StructureToPtr会报异常
    *((char*)buffer)之所以会错误我认为是这样的,在C#中char代表的是Unicode,占两个字节
    而你的buffer指向的第一个字节是97('a'),第二个字节是8,所以*((char*)buffer)代表的是0x9708
    经过Unicode编码后为乱码也是必然的
    (char)*((byte*)buffer)这样写的话含义就不同了,首先是变为byte类型,为97,再转成char类型的话高位自动填0,当然不会错