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的大小吗?

INDY10 发送bytes数组大小问题kljedl

java:通过设置byte数组的大小来进行数据的读写的时候出现写入的文件内容和读取的文件内容不符怎么办

C# 比较两个包含小写文本的 byte[] 数组

如何将字节数组(即 byte[])保存到 Azure Blob 存储?