如何将btye[]转换为其他类型?

yuanreid 2005-12-13 10:52:24
我从Socket中接收到的数据都是byte[]类型的,如果里面包含的是int32类型的,我目前的做法如下:

// RecvBuf[]中包含int32类型数据的byte[],将其转换为long型,赋值给ServerSecs变量
// 为了演示完整过程,这里将Byte数组转换为网络序列的long型,方便调用NetworkToHostOrder函数。这里也可以不调用NetworkToHostOrder函数,而直接拼成主机序列。

StringBuilder sbValue = new StringBuilder();
sbValue.AppendFormat("{0:X2}{1:X2}{2:X2}{3:X2}00000000", RecvBuf[3],
RecvBuf[2], RecvBuf[1], RecvBuf[0]);
long ServerSecs = long.Parse(sbValue.ToString(),
System.Globalization.NumberStyles.HexNumber);

// 这里转换网络字节序为主机字节序
ServerSecs = System.Net.IPAddress.NetworkToHostOrder(ServerSecs);


有没有更好的办法呢?

再考虑这种情况:如果对方是将一个C++定义的结构实例的内存memcpy到buf中,用Socket发送给我的,我如何将接收到的类型byte[]的数据,转换为对应的数据呢,只能一位一位的操作吗?
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanreid 2005-12-13
  • 打赏
  • 举报
回复
to lookfeng()
谢谢,这个类确实可以完成对基本类型的转换。
速马 2005-12-13
  • 打赏
  • 举报
回复
这个只是用了unsafe C#代码而已,但它还是安全的
也不会有内存泄露,因为没有在CRT堆上分配内存

对于你的问题,这个绝对是最佳方案
yuanreid 2005-12-13
  • 打赏
  • 举报
回复
to Sunmast(速马/READY TO ROCK)
这个应该不是受控代码吧?
不过还是非常感谢。
lookfeng 2005-12-13
  • 打赏
  • 举报
回复
System.BitConverter可以满足你的要求
速马 2005-12-13
  • 打赏
  • 举报
回复
public static unsafe byte[] Struct2Bytes(Object obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
fixed(byte* pb = &bytes[0])
{
Marshal.StructureToPtr(obj,new IntPtr(pb),true);
}
return bytes;
}

public static unsafe Object Bytes2Struct(byte[] bytes)
{
fixed(byte* pb = &bytes[0])
{
return Marshal.PtrToStructure(new IntPtr(pb), typeof(Data));
}
}
yuanreid 2005-12-13
  • 打赏
  • 举报
回复
转换为string的我知道,其他的呢?
希望有受控代码的方式。
charles_y 2005-12-13
  • 打赏
  • 举报
回复
System.Text.Encoding.UTF8.GetString(byte[])
System.Text.Encoding.Unicode.GetString(..)
System.Text.Encoding.GetEncoding("gb2312").GetString(..)


转化为string

110,536

社区成员

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

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

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