对一老问题又犯蒙了,好像是说在非托管内存里当charset.Ansi时Marshal.SizeOf(typeof(char))的大小是1,可是实在没想明白如果char是一个汉字,一个字节的空间如何够存呢
谁有相关资料推荐偶看看,baidu一阵没什么收获
谁有相关资料推荐偶看看,baidu一阵没什么收获
解决方案 »
- combobox的选中某一项时,如何对选中项进行处理显示在Text框里
- C#编程?请指点指点
- SOCKET 服务器双网卡,如何绑定IP?急急急急急急急急急急急急急急急急急急急
- .Net向WebService(Jave编写)时,先在客户端封装的带有double类型、int、DateTime类型属性的对象,服务器端得到的该对象的这些属性均为空(string类型可以得到值),这是什么原因呢?
- 请问C#与VB.NET区别大吗?
- 有没有用c# asp.net做安防监控的?
- web service遇到一个问题,大家来指教
- 急切求教两个对DataGrid操作的问题
- 覆盖文本文件里的数据
- 在线送分 两个问题asp.net 1.asp:dropdownlist.....OnSelectedIndexChanged="updateCopyCompany">不起作用;2.用判断页面有效性
- winform url參數传递问题
- C#的界面布局问题
一个汉字拆成2个ansi char了
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那行输出的是?
为什么呢
Console.WriteLine(buf[0]);
Console.WriteLine(buf[1]);你就发现,它把双字节的低位给写进去了而已,所以不能这么写(b.c1 = 'a';)
赋值时要用Encoding进行转换
试把这行代码
Console.WriteLine(*((char*)buffer));
改成
Console.WriteLine((char)*((byte*)buffer));
就能看到打印出'a'了感谢大家回答,summit
StructureToPtr会报异常
*((char*)buffer)之所以会错误我认为是这样的,在C#中char代表的是Unicode,占两个字节
而你的buffer指向的第一个字节是97('a'),第二个字节是8,所以*((char*)buffer)代表的是0x9708
经过Unicode编码后为乱码也是必然的
(char)*((byte*)buffer)这样写的话含义就不同了,首先是变为byte类型,为97,再转成char类型的话高位自动填0,当然不会错