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);
展开
 我来答
Jarhf
推荐于2016-03-31 · TA获得超过1862个赞
知道小有建树答主
回答量:1736
采纳率:25%
帮助的人:1020万
展开全部
给你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;还原了
宣义坊的大蚂蚁
2008-11-25 · TA获得超过2830个赞
知道大有可为答主
回答量:1617
采纳率:90%
帮助的人:867万
展开全部
在.net中类型转换的原则是小的可以转成大的(byte可以转成long),反过来则不行。
buffer.SetValue(l, 0); 做的事情是将long类型的l转换为byte类型,这个转换是不允许的。这个与l本身的大小没有关系。

Ps:楼上的,即使long l = 1; 依旧会报错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我爱研究2
2008-11-25
知道答主
回答量:16
采纳率:0%
帮助的人:0
展开全部
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();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
白沙博客
2008-11-25 · 超过34用户采纳过TA的回答
知道答主
回答量:105
采纳率:0%
帮助的人:0
展开全部
byte 0 到 255 无符号 8 位整数

你确想把888放到一个byte里,肯定不行啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式