C#.NET byte[] 的一个小问题

把一个long写入到byte[]的前几个字节,然后从byte[]的前几个字节读出到另一个long里面。
是用SetValue和GetValue吗?我写的程序如下,出错了。
byte[] buffer = new byte[1024];
long l = 888;
buffer.SetValue(l, 0);
long l2 = (long)buffer.GetValue(0);

给你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;还原了
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-25
在.net中类型转换的原则是小的可以转成大的(byte可以转成long),反过来则不行。
buffer.SetValue(l, 0); 做的事情是将long类型的l转换为byte类型,这个转换是不允许的。这个与l本身的大小没有关系。

Ps:楼上的,即使long l = 1; 依旧会报错。
第2个回答  2008-11-25
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();
第3个回答  2008-11-25
byte 0 到 255 无符号 8 位整数

你确想把888放到一个byte里,肯定不行啊

有关c#代码中 “byte[] 变量名” 的问题?
byte就是类型的数据,byte[]是定义的数组啊,另外string 和string[]是不一样的,string相当于是一个char[],char类型的数组,而string[]就是平时指的字符串数组

.net中使用c#对byte[]到字符串的转换
ok,给出完整程序,需要using System.Text;static void Main(string[] args){ byte[] bytearray = { 255, 255, 3, 10 };StringBuilder sb = new StringBuilder();foreach (byte b in bytearray){ sb.Append(b > 15 ? Convert.ToString(b, 16) : '0' + Convert.ToString(b, 16));} ...

C# new byte[]内部原理是什么样?循环1000000次, new byte[100] 比new...
的原因是:操作系统的内存分配方式,new byte[100]能更多的采用连续分配内存,占用的空间少.而new byte[10000]可能会更多的涉及到非连续分配内存(内存数据的移动,移动,标记,回收等...涉及到操作系统知识),需要操作系统涉及到更多的内存优化算法所以就慢了....

c#中 byte[] 与Byte[] (第一个字母大写)有什么关系,区别?
他们是完全一样的。byte[]中的byte是C#的保留字,意思是字节;Byte[]中的Byte是.netFramework的类名,也是表示字节的,这个Byte[]在.net的任何语言中均可使用。

.net中关于一个汉字所占字符的问题?
要比字节长度不能用.net的 string类型,需要换成byte例如string a="汉字";string b="ab";byte[] b1 = System.Text.Encoding.Default.GetBytes(a);byte[] b2 = System.Text.Encoding.Default.GetBytes(b);MessageBox.Show(b1.length);MessageBox.Show(b2.length); 结果就是4 和 2 PS:System...

C# new byte[]内部原理是什么样?循环1000000次, new byte[100] 比new...
new byte[100] 比new byte[10000] 时间短 的原因是:操作系统的内存分配方式,new byte[100]能更多的采用连续分配内存,占用的空间少.而new byte[10000]可能会更多的涉及到非连续分配内存(内存数据的移动,移动,标记,回收等...涉及到操作系统知识),需要操作系统涉及到更多的内存优化算法所以就慢了....

c# 中的 new byte[]{(byte)j}是什么意思 ?说通俗点谢谢!
新建一个byte类型数组,按照你的就是数组长度为1,存放一个数据j。(byte)j是一个转换,将j转换为byte类型。

C#.NET从串口读出来的不可见字符怎么处理?
BitConvert.ToString(byte[]) 直接把 byte 数据转化为文本用于调试输出。这个类的其它方法可以对 byte[] 做一些转换,如读取 int, float 等,请根据实际需要使用。

C#中变长数组
.Net的数组大小可以在运行时确定,比如 byte[] bytes = new byte[n]; \/\/ 创建一个大小为n的数组 数组一旦创建,大小不可变,如果要可变 那就别用数组了,用List<T>,比如 List<byte> bytes = new List<byte>(); \/\/ 创建一个空的列表 bytes.Add( (byte)100 ); \/\/ 添加一个元素 ...

关于C#转码问题,如果字符串里面含有中文、英文、数字,那请问怎样转为对...
回答问题 将字符串转换到16进制,只要先制定一个字符编码转化为byte[]。下面实例使用UTF8转换:byte[] data = System.Text.Encoding.UTF8.GetBytes("中文English0123456789"); 然后将byte[]转换为十六进制表示即可。.NET只提供了byte到16进制的方法,所以在这里新写了一个byte[]到16进制的方法:...

相似回答