2009-05-06 31 views
28

Tôi có một hàm điền vào một mảng kiểu sbyte [], và tôi cần chuyển mảng này tới hàm khác chấp nhận tham số kiểu byte [].Làm thế nào để chuyển đổi một sbyte [] thành byte [] trong C#?

Tôi có thể chuyển đổi nó độc đáo và nhanh chóng mà không cần sao chép tất cả dữ liệu hoặc sử dụng ma thuật unsafe?

+0

vừa thêm một số khoảng trắng vào chữ Q, hy vọng bạn không nhớ: D – inspite

Trả lời

42

Có, bạn có thể. Vì cả hai số bytesbyte đều có cùng một biểu diễn nhị phân, không cần phải sao chép dữ liệu. Chỉ cần làm một diễn viên để Array, sau đó đúc nó vào byte[] và nó sẽ là đủ.

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
byte[] unsigned = (byte[]) (Array)signed; 
+0

Thật tuyệt vời! Tôi đã không nghĩ về điều này. : P –

+4

Khá thường xuyên tôi nhận được một loại mảng không phù hợp bằng cách sử dụng phương pháp này –

+0

Tôi đã thử điều này nhưng nó dint làm việc. Kết quả là dấu chấm hỏi. Một cái gì đó mà tôi đã không nhìn thấy trước đây. Đây là mã số 'sbyte [] txdata = {(0x00 | 0x20), ~ (1 << 6)}; byte [] dss = (byte []) ((Mảng) txdata); ' –

24

Bạn sẽ phải sao chép dữ liệu (chỉ các mảng kiểu tham chiếu là biến thể) - nhưng chúng tôi có thể cố gắng làm điều đó một cách hiệu quả; Buffer.BlockCopy dường như làm việc:

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
    byte[] unsigned = new byte[signed.Length]; 
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length); 

Nếu đó là một tài liệu tham khảo-type, bạn chỉ có thể đúc các tài liệu tham khảo mà không cần sao chép các mảng:

Foo[] arr = { new Foo(), new Foo() }; 
    IFoo[] iarr = (IFoo[])arr; 
    Console.WriteLine(ReferenceEquals(arr, iarr)); // true 
+0

Yup ... nhưng đọc câu cuối cùng của câu hỏi. ;) –

+0

Đã chỉnh sửa để bao gồm ghi chú về hiệp phương sai –

+0

Thực sự ??? Bạn đang cung cấp câu trả lời bằng cách bao gồm "mảng tham chiếu kiểu là biến thể"? Thôi nào, ít nhất hãy cố gắng hữu ích nếu không có bling ngữ nghĩa tự mãn. – BoiseBaked

6

Nếu bạn đang sử dụng .NET 3.5+, bạn có thể sử dụng như sau:

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a); 

Tôi đoán sao chép có hiệu quả tất cả dữ liệu.

Lưu ý rằng chức năng này cũng nằm trong .NET 2.0, nhưng thay vào đó bạn phải sử dụng một phương thức ẩn danh.

+0

Ugh. Tôi muốn sử dụng Buffer.BlockCopy() sau đó. Điều đó ít nhất một cách mù quáng sao chép một loạt các byte. Điều này có một cuộc gọi chức năng cho mỗi người trong số họ. Hiệu suất cơn ác mộng. –

+1

Vâng, tất cả phụ thuộc vào số tiền bạn đang sao chép, nhưng vâng, Bản sao khối có ý nghĩa hơn. Cuối cùng, nếu bạn muốn loại an toàn, cách duy nhất là sao chép. Nếu bạn muốn chuyển đổi (re-cast) mảng, không an toàn là cách duy nhất để đi. – Clinton

+0

LOL! Hoặc bạn có thể làm điều tương tự mà không phải trả phí: byte [] foo = (byte []) (Mảng) đã ký; – BoiseBaked

Các vấn đề liên quan