這是一個簡單的,我認爲會得到答案的。我確實試圖在這裏找到一個答案,但沒有提出任何事情 - 如果有一些我錯過了的話,我很抱歉。字節數組的StringBuilder等效
無論如何,是否有相當於StringBuilder,但字節數組?
我並不關心Append()
的所有不同過載 - 但我想看到Append(byte)
和Append(byte[])
。
周圍有什麼東西還是自己動手?
這是一個簡單的,我認爲會得到答案的。我確實試圖在這裏找到一個答案,但沒有提出任何事情 - 如果有一些我錯過了的話,我很抱歉。字節數組的StringBuilder等效
無論如何,是否有相當於StringBuilder,但字節數組?
我並不關心Append()
的所有不同過載 - 但我想看到Append(byte)
和Append(byte[])
。
周圍有什麼東西還是自己動手?
將MemoryStream
爲你工作?界面可能不太方便,但它提供了一種簡單的附加字節的方法,當你完成後,你可以通過調用ToArray()
來獲得內容爲byte[]
。
更多StringBuilder
-like接口可能可以通過擴展方法來實現。
更新
擴展方法看起來是這樣的:
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
大概List<byte>
:
var byteList = new List<byte>();
byteList.Add(42);
byteList.AddRange(new byte[] { 1, 2, 3 });
...然後追加(字節)變爲添加(字節),並追加(字節[])變的AddRange(字節[])。 – 2010-10-25 14:39:57
請注意,與'StringBuilder'一樣,將元素添加到'List'將被攤銷O(1)。 – Brian 2010-10-25 14:43:03
好的,很酷 - 只有一個問題......會有效嗎?我知道List <>在底層爲AddRange做了一些有效的拷貝,但我不知道這是否是最有效的方法呢? – 2010-10-25 14:43:28
List<byte>
然後,當你想把它當作一個數組,你可以調用ToArray()
的MemoryStream
方法是好的,但如果你想要有類似StringBuilder的行爲,請添加一個BinaryWriter
。 BinaryWriter提供了您可能需要的所有寫入覆蓋。
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write((byte)67);
writer.Write(new byte[] { 68, 69 });
+1尼斯解決方案! – kol 2012-12-28 18:54:46
如果您需要特殊作者,您也可以從BinaryWriter派生一個新類。我做了一個處理hton轉換的程序。 – 2014-02-18 22:44:45
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;
}
}
是的,它會 - 我喜歡這種方法......謝謝 – 2010-10-25 14:43:07
我可以問一下 - 我之前沒有真正看到'new [] {value}'的語法 - 是推斷數組的類型嗎? – 2010-10-25 14:51:25
@Matt:是的,這是正確的。在擴展方法中,'value'是'byte'類型,所以'byte []'被推斷出來。在最後一個示例中,我需要指定'new byte []',否則編譯器會推斷'int'類型。 – 2010-10-25 14:53:02