byte数组大小问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了byte数组大小问题相关的知识,希望对你有一定的参考价值。
string msg = "我是我是我是我是我是";
byte[] buffer = new byte[4];
buffer = Encoding.Unicode.GetBytes(msg);
string result = Encoding.Unicode.GetString(buffer);
Console.WriteLine(result);
byte数组的长度是4,这么长的字符串为什么还能放进去而没被截断,初始化byte数组的4到底代表什么,忘高人指点
1楼说清楚点
string msg = "我是我是我是我是我是";
Byte[] b = Encoding.Unicode.GetBytes(msg);
MemoryStream ms = new MemoryStream(b);
byte[] buffer = new byte[4];
ms.Read(buffer, 0, (Int32)ms.Length);
// buffer = Encoding.Unicode.GetBytes(msg);
string result = Encoding.Unicode.GetString(buffer);
Console.WriteLine(result);
Console.ReadLine();
这个代码就会报错,说数组超过大小。
但是你的那个代码为什么没报错呢?因为数组是引用类型;
虽然你 开始 初始化了 长度为4;
但是你后来又写了 buffer= Encoding.Unicode.GetBytes(msg);
右边这个是一个长度为20的字节数组,由于byte []是引用类型,他的数据是放在称为“堆”的内存区域中,所以指向了一个新的引用,即Encoding.Unicode.GetBytes(msg); 所以即使长度变多了也不会报错。 参考技术A 1 byte = 1字节 = 8bit
一个unicode 表示的汉字 = 2字节 = 16bit
byte[] buffer = new byte[4]; 的意思是 新建了一个,byte类型的数组,长度为4,也就是说 这个数组中有 四个 byte,整个数组的大小 =4 * 1字节=4个字节
string msg = "我是我是我是我是我是"; 占 20个字节
逻辑上看,是装不进去的,数组会越界 参考技术B 数组长度是16好不,byte的长度才是
将一个byte[]数组根据大小拆分为若干小byte[]数组方法
/// <summary>
/// 将大数组拆分为多个小数组
/// </summary>
/// <param name="superbyte">需要拆分原始数组</param>
/// <param name="size">拆分后单个数组大小</param>
/// <returns></returns>
public List<byte[]> SplitList(byte[] superbyte , int size)
{
List<byte[]> result = new List<byte[]>();
int length = superbyte.Length;
int count = length / size;
int r = length % size;
for (int i = 0; i < count; i++)
{
byte[] newbyte = new byte[size];
newbyte = superbyte.Skip(size * i).Take(size).ToArray();// SplitArray(superbyte, size*i, size * i+ size);
result.Add(newbyte);
}
if (r != 0)
{
byte[] newbyte = new byte[r];
newbyte = superbyte.Skip(length - r).Take(r).ToArray();
result.Add(newbyte);
}
return result;
}
以上是关于byte数组大小问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java UDP 中获取实际数据包大小 `byte[]` 数组
Java中一个byte是多少个字节,如果byte数组的长度是1024,是1mb的大小吗?