2015-08-15 37 views
14

Tôi đã viết lớp của riêng mình để chuyển đổi các nguyên mẫu chuẩn C# thành các mảng byte.Chức năng GetBytes hoạt động như thế nào?

Sau đó, tôi đã xem một lớp học BitConvertersource để xem các chuyên gia đã làm như thế nào.

mã ví dụ của tôi:

public static byte[] getBytes(short value) { 
    byte[] bytes = new byte[2]; 

    bytes[0] = (byte)(value >> 8); 
    bytes[1] = (byte)value; 

    return bytes; 
} 

BitConverter mã lớp:

public unsafe static byte[] GetBytes(short value) 
{ 
    byte[] bytes = new byte[2]; 
    fixed(byte* b = bytes) 
     *((short*)b) = value; 
    return bytes; 
} 

Tại sao chức năng của họ được gắn thẻ như không an toàn và sử dụng khai thác cố định?

Lỗi chức năng như vậy có dễ bị xảy ra ngay cả khi chúng sử dụng không an toàn không? Tôi có nên bỏ mỏ và sử dụng chúng không? Đó là hiệu quả hơn?

+3

Các chức năng này làm những việc khác nhau: Trước đây sử dụng phần lớn endian, cuối cùng là native endian. – CodesInChaos

Trả lời

12

Có, thả của bạn và sử dụng thư viện chuẩn.

Nó hiệu quả hơn vì nó sao chép cả hai byte cùng một lúc bằng cách truyền mảng byte thành một con trỏ ngắn. Để làm điều này nó đòi hỏi phải cố định để cho phép sử dụng con trỏ, và do đó từ khóa không an toàn.

Không thể tránh mã không an toàn trong hội đồng của riêng bạn, vì điều đó có nghĩa là mã của bạn không thể được đảm bảo an toàn và do đó chỉ có thể chạy trong môi trường hoàn toàn đáng tin cậy.

Tuy nhiên, vì Bitconverter là một phần của các hội đồng chuẩn .Net được ký bởi Microsoft, Windows biết chúng ổn.

Chức năng thư viện ít bị lỗi hơn, vì chúng đã bị hàng triệu nhà phát triển sử dụng chúng hàng ngày, trong khi chức năng của bạn chỉ được kiểm tra bởi bạn.

+0

Làm cho tinh thần, tôi đoán tôi chỉ nên tạo trình bao bọc xung quanh lớp BitConverter, chẳng hạn như GetBytes từ chuỗi. – Scavs

+3

@Scavs Đối với 'Chuỗi', bạn nên sử dụng' System.Text.Encoding.GetBytes' (https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110) .aspx), không phải BitConverter. – Rotem

+0

Bạn nói đúng, tôi đoán tôi nên cắt "điều khiển lại bánh xe". – Scavs

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