2015-08-15 57 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