2010-10-25 13 views
25

Đây là một cái đơn giản, và cái mà tôi nghĩ sẽ được trả lời. Tôi đã cố gắng tìm một câu trả lời ở đây, nhưng đã không đưa ra bất cứ điều gì - vì vậy xin lỗi nếu có một cái gì đó tôi đã bỏ qua.Tương đương với StringBuilder cho mảng byte

Dù sao, có tương đương với StringBuilder nhưng đối với mảng byte không?

Tôi không lo lắng về tất cả các tình trạng quá tải khác nhau của Append() - nhưng tôi muốn xem Append(byte)Append(byte[]).

Có bất kỳ thứ gì trong khoảng thời gian của bạn không?

Trả lời

25

Would MemoryStream công việc cho bạn? Giao diện có thể không khá thuận tiện, nhưng nó cung cấp một cách đơn giản để nối thêm byte, và khi bạn hoàn thành, bạn có thể lấy nội dung dưới dạng byte[] bằng cách gọi ToArray().

Có thể đạt được một giao diện giống như StringBuilder khác bằng cách tạo phương thức tiện ích mở rộng.

Cập nhật
phương pháp mở rộng có thể nhìn như thế này:

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); 
    } 
} 

Cách sử dụng:

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 
+0

Có nó sẽ - Tôi thích cách tiếp cận đó ... Cảm ơn –

+0

Tôi có thể hỏi - tôi chưa thực sự thấy cú pháp 'new [] {value}' trước đây - có phải là suy ra kiểu mảng không? –

+2

@Matt: vâng, đó là chính xác. Trong phương thức mở rộng, 'giá trị' là kiểu' byte', do đó 'byte []' được suy ra. Trong ví dụ cuối cùng, tôi cần xác định 'new byte []' vì trình biên dịch sẽ suy ra kiểu 'int' nếu không. –

11

lẽ List<byte>:

var byteList = new List<byte>(); 
byteList.Add(42); 
byteList.AddRange(new byte[] { 1, 2, 3 }); 
+0

... và sau đó Nối (byte) trở Thêm (byte) và Nối (byte []) trở thành AddRange (byte []). –

+0

Lưu ý rằng với 'StringBuilder', việc thêm các phần tử vào một' Danh sách' được phân bổ theo O (1). – Brian

+0

Ok, tuyệt - chỉ một câu hỏi ... Điều đó có hiệu quả không? Tôi biết Danh sách <> thực hiện một số bản sao hiệu quả cho AddRange dưới mui xe, nhưng tôi không biết liệu nó có hoạt động như một cách hiệu quả nhất để làm điều đó không? –

2

List<byte> Sau đó, khi bạn muốn nó như một mảng bạn có thể gọi ToArray()

12

Các MemoryStream cách tiếp cận là tốt, nhưng nếu bạn muốn có hành vi giống như StringBuilder, hãy thêm BinaryWriter. BinaryWriter cung cấp tất cả ghi đè ghi đè bạn có thể muốn.

MemoryStream stream = new MemoryStream(); 
BinaryWriter writer = new BinaryWriter(stream); 
writer.Write((byte)67); 
writer.Write(new byte[] { 68, 69 }); 
+0

+1 Giải pháp tuyệt vời! – kol

+0

Bạn cũng có thể lấy được một lớp mới từ BinaryWriter nếu bạn cần các nhà văn đặc biệt. Tôi đã thực hiện một trong đó xử lý chuyển đổi hton. –

0
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; 
    } 
}