怎么把struct 拷贝到string 中(急)

chenyong_cd 2007-07-16 11:57:23
怎么把struct 拷贝到string 中,现在有一个结构体,现在怎么样把struct拷贝到string中去,struct为utf8编码.
...全文
381 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpingy 2007-07-18
  • 打赏
  • 举报
回复
序列化应该是中可行的办法
chenyong_cd 2007-07-16
  • 打赏
  • 举报
回复
是根据以前的C++代码改写.C++里面用到了memcpy()函数,把结构拷贝到char 数组,我现在要用C#实现这个功能
jerryfos 2007-07-16
  • 打赏
  • 举报
回复
既然使用统一编码了,楼主你可以考虑用自定义的分隔符吧
viena 2007-07-16
  • 打赏
  • 举报
回复
楼主你要说你的最终目的是什么?
比如DateTime或Color,
转换后的string是什么?
Pittypat 2007-07-16
  • 打赏
  • 举报
回复
Marshal也许可以帮上忙!
suxe 2007-07-16
  • 打赏
  • 举报
回复
用ToString函数或是强制类型转换都可以
suxe 2007-07-16
  • 打赏
  • 举报
回复
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;
}
viena 2007-07-16
  • 打赏
  • 举报
回复
每个struct内容是不一样的,不存在通用的struct到string的方法~
viena 2007-07-16
  • 打赏
  • 举报
回复
你要在struct中实现这个方法~
suxe 2007-07-16
  • 打赏
  • 举报
回复
重载ToString()或是类型改换运行符

struct为utf8编码.是什么意思
marvelstack 2007-07-16
  • 打赏
  • 举报
回复
能不能变通一下,通过序列化和反序列化实现。
http://www.microsoft.com/china/MSDN/library/archives/library/dndotnet/html/objserializ.asp
阿亮 2007-07-16
  • 打赏
  • 举报
回复
不过话又说回来,.Net托管代码反对直接操作内存,所以写一些硬件相关的程序的时候,内存块的操作在.Net里显得非常麻烦,比起C,C++,Delphi来讲难用的多的多的多多多多。
阿亮 2007-07-16
  • 打赏
  • 举报
回复
参考我写的一个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);

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧