int []到byte [],我忘记了什么吗?

时间:2009-04-15 02:44:03

标签: c#

这是未经测试的,因为我需要编写更多代码。但这是正确的,我觉得我错过了一些东西,比如这可以写得更好。我最后需要c.lose吗?我应该冲洗任何东西(如果我关闭(),我会假设不是吗?

Byte[] buffer;
using (var m = new MemoryStream())
{
    using (var binWriter = new BinaryWriter(m))
    {
        foreach (var v in wordIDs)
            binWriter.Write(v);
        binWriter.Close();
    }
    buffer = m.GetBuffer();
    m.Close();
}

6 个答案:

答案 0 :(得分:4)

你不需要.Close()调用(使用块生成的自动.Dispose()处理那些)。

此外,您将要在MemoryStream上使用.ToArray(),而不是.GetBuffer()。 GetBuffer()返回底层缓冲区,无论它使用了多少。 ToArray()返回一个完美长度的副本。

如果您使用它与其他程序通信,请确保您和它同意字节的顺序(也就是字节顺序)。如果你正在使用网络字节顺序,你需要翻转字节的顺序(使用类似IPAddress.HostToNetworkOrder()),因为网络字节顺序是big-endian,而BinaryWriter使用little-endian。 / p>

答案 1 :(得分:2)

什么是wordIDs,它是枚举还是Int32 []?如果它只是Int32 []:

,您可以使用以下内容
byte[] bytes = new byte[wordIDs.Length * 4];
Buffer.BlockCopy(wordIDs, 0, bytes, 0, bytes.Length);

否则,如果wordID是必须单步执行的枚举,则需要更改的是删除m.Close(如上所述)并使用MemoryStream.ToArray(如上所述)。

答案 2 :(得分:0)

这里不需要关闭。 using语句将确保在退出时调用这些类型的Dispose方法,这与调用Close具有相同的效果。事实上,如果你看一下反射器中的代码,你会发现两种情况下的Close都代表两种类型的Dispose方法。

答案 3 :(得分:0)

因此说Skeet

  

没有真正的需要关闭   一个MemoryStream或一个BinaryWriter,但是   我认为使用一个使用是很好的形式   处理两者的声明 - 那   如果你以后改变的方式   使用真正 需要的东西   处置,它将适合相同   代码。

所以你不需要Close或using语句,但使用的是惯用的C#。

答案 4 :(得分:0)

JaredPar和Jonathan的回答都是正确的。如果您想要替代方案,请使用BitConverter.GetBytes(int)。所以现在你的代码变成了这个

wordIDs.SelectMany(i => BitConverter.GetBytes(i));

答案 5 :(得分:0)

我不同意这里的Skeet。

虽然使用你可能不会需要关闭你依赖于BinaryWriter和MemoryStream的实现来在Dispose方法中为你做这件事。对于框架类型来说也是如此,但是如果有人写了一个没有这样做的Writer或Stream呢?

添加关闭不会造成伤害,并可以保护您免受错误编写的课程的影响。