怎么把struct 拷贝到string 中(急) 重载ToString()或是类型改换运行符struct为utf8编码.是什么意思 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每个struct内容是不一样的,不存在通用的struct到string的方法~ public struct Person { public string FirstName { get { return firstName; } set { firstName = value;} } public string SecondName { get { return secondName;} set { secondName = value;} } public override string ToString() { return string.Format("{0} {1}", firstName, secondName); } public static explicit operator string(Person aPerson) { return string.Format("{0} {1}", aPerson.firstName, aPerson.secondName); } private string firstName; private string secondName; } 用ToString函数或是强制类型转换都可以 楼主你要说你的最终目的是什么?比如DateTime或Color,转换后的string是什么? 是根据以前的C++代码改写.C++里面用到了memcpy()函数,把结构拷贝到char 数组,我现在要用C#实现这个功能 参考我写的一个dbf操作类的部门代码,你研究一下 unsafe, fix, encoding, marshal等,应该可以得到你想要的。 /// <summary> /// dbf文件的单个字段结构 /// </summary> public unsafe struct DbfField { const int MaxFieldLength = 11; #region 字段 private fixed byte _FieldName[MaxFieldLength]; /// <summary> /// 字段的类型 /// </summary> public DbfFieldType FieldType; /// <summary> /// 保留 /// </summary> private fixed byte Resvr1[4]; /// <summary> /// 字段的长度 /// </summary> public byte FieldSize; /// <summary> /// 字段的精度 /// </summary> public byte Precision; /// <summary> /// 保留 /// </summary> private fixed byte Resvr2[14]; #endregion #region 内存 /// <summary> /// 该结构类型的内存容量 /// </summary> /// <returns></returns> public static int MemorySize() { unsafe { return sizeof(DbfField); } } /// <summary> /// 从字节数组中装载数据 /// </summary> /// <param name="src"></param> public void LoadMemory(byte[] src) { unsafe { DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(src, 0); this = *p; } } /// <summary> /// 系列化到字节数组中 /// </summary> /// <returns></returns> public byte[] GetMemory() { unsafe { byte[] dest = new byte[MemorySize()]; DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(dest, 0); *p = this; return dest; } } /// <summary> /// 产生一个新的空的该类型的字节数组 /// </summary> /// <returns></returns> public static byte[] NewMemory() { return new byte[MemorySize()]; } #endregion /// <summary> /// 用指定的字节数组构造 /// </summary> /// <param name="src"></param> public DbfField(byte[] src) { this = new DbfField(); LoadMemory(src); } /// <summary> /// 字段名称 /// </summary> public string FieldName { get { fixed (DbfField* p = &this) { return Marshal.PtrToStringAnsi((IntPtr)p->_FieldName); } } set { fixed (DbfField* p = &this) { for (int i = 0; i < MaxFieldLength; i++) p->_FieldName[i] = 0; byte* v = (byte*)Marshal.StringToHGlobalAnsi(value); for (int i = 0; (i < MaxFieldLength) && (v[i] != 0); i++) p->_FieldName[i] = v[i]; } } } public void InitDefine(string fieldName, DbfFieldType fieldType, byte fieldSize, byte precision) { FieldName = fieldName; FieldType = fieldType; FieldSize = fieldSize; Precision = precision; } }最后,参考以下代码,将struct复制到string里Marshal.PtrToStringAnsi(Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, BufferIndex), len); 不过话又说回来,.Net托管代码反对直接操作内存,所以写一些硬件相关的程序的时候,内存块的操作在.Net里显得非常麻烦,比起C,C++,Delphi来讲难用的多的多的多多多多。 能不能变通一下,通过序列化和反序列化实现。http://www.microsoft.com/china/MSDN/library/archives/library/dndotnet/html/objserializ.asp 利用webBrowser1已有的cookie去访问一个属于这个cook的新的网页??如何实现 还是datagrid绑定时间问题 请大家帮助:关于无线传输问题 一个奇怪的问题!请各位大侠帮帮忙! stephenZL接分,答应了解决问题后600分 字符串转换为DateTime格式 access 数据库内容导入到SQL Server中问题 webbrowser 强制用IE8显示 之后怎么调试啊 用什么方式能实现与所有类型(主流)数据库通信? 请问怎么更改另一个用户控件中label的文本值 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 有成都的C#前辈吗?我初学C# 想有位老师进行下指导
{
public string FirstName
{
get { return firstName; }
set { firstName = value;}
} public string SecondName
{
get { return secondName;}
set { secondName = value;}
} public override string ToString()
{
return string.Format("{0} {1}", firstName, secondName);
} public static explicit operator string(Person aPerson)
{
return string.Format("{0} {1}", aPerson.firstName, aPerson.secondName);
}
private string firstName; private string secondName;
}
比如DateTime或Color,
转换后的string是什么?
/// dbf文件的单个字段结构
/// </summary>
public unsafe struct DbfField
{
const int MaxFieldLength = 11; #region 字段
private fixed byte _FieldName[MaxFieldLength];
/// <summary>
/// 字段的类型
/// </summary>
public DbfFieldType FieldType;
/// <summary>
/// 保留
/// </summary>
private fixed byte Resvr1[4];
/// <summary>
/// 字段的长度
/// </summary>
public byte FieldSize;
/// <summary>
/// 字段的精度
/// </summary>
public byte Precision;
/// <summary>
/// 保留
/// </summary>
private fixed byte Resvr2[14];
#endregion #region 内存 /// <summary>
/// 该结构类型的内存容量
/// </summary>
/// <returns></returns>
public static int MemorySize()
{
unsafe
{
return sizeof(DbfField);
}
}
/// <summary>
/// 从字节数组中装载数据
/// </summary>
/// <param name="src"></param>
public void LoadMemory(byte[] src)
{
unsafe
{
DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(src, 0);
this = *p;
} }
/// <summary>
/// 系列化到字节数组中
/// </summary>
/// <returns></returns>
public byte[] GetMemory()
{
unsafe
{
byte[] dest = new byte[MemorySize()];
DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(dest, 0);
*p = this;
return dest;
}
}
/// <summary>
/// 产生一个新的空的该类型的字节数组
/// </summary>
/// <returns></returns>
public static byte[] NewMemory()
{
return new byte[MemorySize()];
}
#endregion /// <summary>
/// 用指定的字节数组构造
/// </summary>
/// <param name="src"></param>
public DbfField(byte[] src)
{
this = new DbfField();
LoadMemory(src);
} /// <summary>
/// 字段名称
/// </summary>
public string FieldName
{
get
{
fixed (DbfField* p = &this)
{
return Marshal.PtrToStringAnsi((IntPtr)p->_FieldName);
}
} set
{
fixed (DbfField* p = &this)
{
for (int i = 0; i < MaxFieldLength; i++)
p->_FieldName[i] = 0;
byte* v = (byte*)Marshal.StringToHGlobalAnsi(value);
for (int i = 0; (i < MaxFieldLength) && (v[i] != 0); i++)
p->_FieldName[i] = v[i];
}
}
} public void InitDefine(string fieldName, DbfFieldType fieldType, byte fieldSize, byte precision)
{
FieldName = fieldName;
FieldType = fieldType;
FieldSize = fieldSize;
Precision = precision;
}
}
最后,参考以下代码,将struct复制到string里
Marshal.PtrToStringAnsi(Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, BufferIndex), len);
http://www.microsoft.com/china/MSDN/library/archives/library/dndotnet/html/objserializ.asp