这是一个简单的问题,我认为应该已经有答案了。我尝试在这里找到答案,但没有找到任何东西-如果我漏掉了什么,请原谅。
那么,是否有类似StringBuilder但适用于字节数组的东西呢?
我不关心所有不同的Append()
重载-但我想看到Append(byte)
和Append(byte [])
。
有类似的东西吗,还是需要自己实现?
这是一个简单的问题,我认为应该已经有答案了。我尝试在这里找到答案,但没有找到任何东西-如果我漏掉了什么,请原谅。
那么,是否有类似StringBuilder但适用于字节数组的东西呢?
我不关心所有不同的Append()
重载-但我想看到Append(byte)
和Append(byte [])
。
有类似的东西吗,还是需要自己实现?
MemoryStream
可行吗?该接口可能不太方便,但它提供了一种简单的方法来追加字节,完成后您可以通过调用ToArray()
以byte[]
形式获取内容。
通过创建扩展方法,可以实现更类似于StringBuilder
的接口。
更新
扩展方法可以这样写:
public static class MemoryStreamExtensions
{
public static void Append(this MemoryStream stream, byte value)
{
stream.Append(new[] { value });
}
public static void Append(this MemoryStream stream, byte[] values)
{
stream.Write(values, 0, values.Length);
}
}
用法:
MemoryStream stream = new MemoryStream();
stream.Append(67);
stream.Append(new byte[] { 68, 69 });
byte[] data = stream.ToArray(); // gets an array with bytes 67, 68 and 69
MemoryStream
方法非常好,但如果您想要类似于StringBuilder的行为,请添加BinaryWriter
。BinaryWriter提供了所有你需要的写入重载函数。
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write((byte)67);
writer.Write(new byte[] { 68, 69 });
stream.ToArray();
获取数组。 - Peet BritsBinaryWriter
的 Write(String)
方法会向流中写入长度前缀! - Lukas Körfer可能是 List<byte>
:
var byteList = new List<byte>();
byteList.Add(42);
byteList.AddRange(new byte[] { 1, 2, 3 });
ICollection<T>
,那么 AddRange
方法将使用集合的 Count
属性来预先分配正确大小的列表(如果需要)。如果不是 ICollection<T>
,则列表将需要在添加元素时动态调整大小。 - LukeHStringBuilder
相较于 MemoryStream
突出的一个特性是 StringBuilder.Remove()
。似乎 List<byte>
也提供了一种完全等效的方法,即 List<T>.RemoveRange()
。MemoryStream
API 的不灵活性使我怀疑,在它和 List<T>
都支持的操作上,它可能会更高效,但我还没有进行测试。 - binkiList<byte>
表示一个包含字节类型的列表,当你需要将其转换为数组时,可以调用ToArray()
方法。
using System;
using System.IO;
public static class MemoryStreams
{
public static MemoryStream Append(
this MemoryStream stream
, byte value
, out bool done)
{
try
{
stream.WriteByte(value);
done = true;
}
catch { done = false; }
return stream;
}
public static MemoryStream Append(
this MemoryStream stream
, byte[] value
, out bool done
, uint offset = 0
, Nullable<uint> count = null)
{
try
{
var rLenth = (uint)((value == null) ? 0 : value.Length);
var rOffset = unchecked((int)(offset & 0x7FFFFFFF));
var rCount = unchecked((int)((count ?? rLenth) & 0x7FFFFFFF));
stream.Write(value, rOffset, rCount);
done = true;
}
catch { done = false; }
return stream;
}
}
value
的类型是byte
,因此会推断出byte[]
。在最后一个示例中,我需要指定new byte[]
,否则编译器会推断出类型int
。 - Fredrik MörkMemoryStream
中没有这样的功能。我脑海中只能想到Queue<byte>
这个类了。 - Fredrik MörkAppend
重载,使用stream.WriteByte(value)
会更有效率,因为它可以避免中间的byte[]
数组分配。 - Justin Van Patten