2015-08-15 86 views
14

我寫了我自己的類,它將C#標準原語轉換爲字節數組。GetBytes函數如何工作?

後來,我看了BitConvertersource,看看專業人員如何做到這一點。

我的代碼示例:

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

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

    return bytes; 
} 

BitConverter類代碼:

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

爲什麼它們的功能標記爲不安全的,使用固定運營商?

即使他們使用不安全,這些功能是否容易出錯?我應該放棄我的使用他們的實施?哪個更有效率?

+3

這些函數做不同的事情:前者使用大端,後者是本地端。 – CodesInChaos

回答

12

是的,放下你的標準庫。

它更有效率,因爲它通過將字節數組轉換爲短指針來同時複製兩個字節。要做到這一點,它需要固定,以允許使用指針,並因此使用不安全的關鍵字。

不安全的代碼通常要在您自己的程序集中避免,因爲這意味着您的代碼無法保證安全,因此只能在完全可信的環境中運行。

但是,由於Bitconverter是Microsoft簽署的標準.Net程序集的一部分,因此Windows知道他們沒問題。

庫函數也不太容易出錯,因爲數百萬開發者每天都在使用它們,而您的函數只能由您進行測試。

+0

有道理,我想我應該只創建BitConverter類的包裝,比如GetBytes來自字符串。 – Scavs

+3

@Scavs對於'String',你應該使用'System.Text.Encoding.GetBytes'(https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110) .aspx),而不是BitConverter。 – Rotem

+0

你是對的,我想我應該削減「重塑輪子」的事情。 – Scavs