C#.NET byte[] 的一个小问题
把一个long写入到byte[]的前几个字节,然后从byte[]的前几个字节读出到另一个long里面。是用SetValue和GetValue吗?我写的程序如下,出错了。b...
把一个long写入到byte[]的前几个字节,然后从byte[]的前几个字节读出到另一个long里面。
是用SetValue和GetValue吗?我写的程序如下,出错了。
byte[] buffer = new byte[1024];
long l = 888;
buffer.SetValue(l, 0);
long l2 = (long)buffer.GetValue(0); 展开
是用SetValue和GetValue吗?我写的程序如下,出错了。
byte[] buffer = new byte[1024];
long l = 888;
buffer.SetValue(l, 0);
long l2 = (long)buffer.GetValue(0); 展开
4个回答
展开全部
给你2个方法,需要添加引用
using System.Runtime.InteropServices;
/// <summary>
/// 把任意类型数据按字节读取到byte[]
/// </summary>
/// <param name="sIn">该类型的一个实例</param>
/// <param name="nLen">该类型的长度</param>
/// <returns>字节流</returns>
public static byte[] ToByte(object sIn, int nLen)
{
IntPtr psIn = IntPtr.Zero;
byte[] buffer = new byte[nLen];
try
{
psIn = Marshal.AllocHGlobal(nLen);
Marshal.StructureToPtr(sIn, psIn, true);
Marshal.Copy(psIn, buffer, 0, nLen);
}
finally
{
if (psIn != IntPtr.Zero) Marshal.FreeHGlobal(psIn);
}
return buffer;
}
//将字节流转成指定类型
public static object ToObject(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length) return null;
IntPtr buffer = Marshal.AllocHGlobal(rawsize);//分配指定大小的内存,返回一个指针
Marshal.Copy(rawdatas, 0, buffer, rawsize);
object retobj = Marshal.PtrToStructure(buffer, anytype);
Marshal.FreeHGlobal(buffer);
return retobj;
}
例如用的时候:
long l = 888;
byte[] bb = ToByte(l,sizeof(long));//结果bb[0]=120;bb[1]=3,其它6位为0(我的机器是从低位读取的)
long l2 = (long)ToObject(bb, typeof(long));//结果l2=888;还原了
using System.Runtime.InteropServices;
/// <summary>
/// 把任意类型数据按字节读取到byte[]
/// </summary>
/// <param name="sIn">该类型的一个实例</param>
/// <param name="nLen">该类型的长度</param>
/// <returns>字节流</returns>
public static byte[] ToByte(object sIn, int nLen)
{
IntPtr psIn = IntPtr.Zero;
byte[] buffer = new byte[nLen];
try
{
psIn = Marshal.AllocHGlobal(nLen);
Marshal.StructureToPtr(sIn, psIn, true);
Marshal.Copy(psIn, buffer, 0, nLen);
}
finally
{
if (psIn != IntPtr.Zero) Marshal.FreeHGlobal(psIn);
}
return buffer;
}
//将字节流转成指定类型
public static object ToObject(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length) return null;
IntPtr buffer = Marshal.AllocHGlobal(rawsize);//分配指定大小的内存,返回一个指针
Marshal.Copy(rawdatas, 0, buffer, rawsize);
object retobj = Marshal.PtrToStructure(buffer, anytype);
Marshal.FreeHGlobal(buffer);
return retobj;
}
例如用的时候:
long l = 888;
byte[] bb = ToByte(l,sizeof(long));//结果bb[0]=120;bb[1]=3,其它6位为0(我的机器是从低位读取的)
long l2 = (long)ToObject(bb, typeof(long));//结果l2=888;还原了
展开全部
在.net中类型转换的原则是小的可以转成大的(byte可以转成long),反过来则不行。
buffer.SetValue(l, 0); 做的事情是将long类型的l转换为byte类型,这个转换是不允许的。这个与l本身的大小没有关系。
Ps:楼上的,即使long l = 1; 依旧会报错。
buffer.SetValue(l, 0); 做的事情是将long类型的l转换为byte类型,这个转换是不允许的。这个与l本身的大小没有关系。
Ps:楼上的,即使long l = 1; 依旧会报错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
byte[] buffer = new byte[1024];
long l = 888;
String str = l.ToString();
for (int i = 0; i < str.Length; i++)
{
buffer[i] = (byte)str.ToCharArray()[i];
}
long l2 = Convert.ToInt64(Encoding.Default.GetString(buffer));
Console.WriteLine(l2);
Console.ReadLine();
long l = 888;
String str = l.ToString();
for (int i = 0; i < str.Length; i++)
{
buffer[i] = (byte)str.ToCharArray()[i];
}
long l2 = Convert.ToInt64(Encoding.Default.GetString(buffer));
Console.WriteLine(l2);
Console.ReadLine();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
byte 0 到 255 无符号 8 位整数
你确想把888放到一个byte里,肯定不行啊
你确想把888放到一个byte里,肯定不行啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询