从BinaryWriter写入byte []

时间:2015-08-12 18:17:28

标签: c#

快速提问。我正在尝试通过Binary Writer将整数转换为7BitEncodedInt。目前,我必须采取的最佳方式如下:

Stream memoryStream = new MemoryStream();
InternalBinaryWriter ibw = new InternalBinaryWriter(memoryStream);
ibw.Write7BitEncodedInt((int)length);
memoryStream.Position = 0;
memoryStream.Read(object.ByteArray, 0, (int)memoryStream.Length);

有没有更简单的方法可以不需要流?我有点不愿意重新实现他们的Write7BitEncodedInt函数,只是将输出直接输出到字节数组,但如果有必要的话,那就是我要做的事情

编辑:

我最终做的是以下内容:

the byteArray is resized accordingly, just didn't include that line in the source.

我最终做的是以下内容:

    byte[] Write7BitEncodedIntToByteArray(int length) {
        List<byte> byteList = new List<byte>();
        while (length > 0x80) {
            byteList.Add((byte)(length | 0x80));
            length >>= 7;
        }
        byteList.Add((byte)length);
        return byteList.ToArray();
    }

1 个答案:

答案 0 :(得分:1)

如果要写入byte[]数组,使用MemoryStream是最简单的方法。实际上,其中一个MemoryStream构造函数接受一个字节数组,并将其用作它将写入的缓冲区。因此,在您的情况下执行以下操作可能更有用:

using( var memoryStream = new MemoryStream( @object.ByteArray ) )
using( var writer = new InternalBinaryWriter( memoryStream ) )
{
    writer.Write7BitEncodedInt( (int) length );
}

请记住,这会导致内存流无法扩展其大小。基于您提供的代码,我认为这样会很好(如果@object.ByteArray小于流数组,您在运行时可能会抛出异常)。

编辑:由于我们正在研究显然性能关键的代码,我测试了三种不同的方法:

列表

static byte[] MethodA( int length )
{
    List<byte> byteList = new List<byte>();
    while (length > 0x80) {
        byteList.Add((byte)(length | 0x80));
        length >>= 7;
    }
    byteList.Add((byte)length);
    return byteList.ToArray();
}

的MemoryStream

static byte[] MethodB( int length )
{
    using( var stream = new MemoryStream( 5 ) )
    {
        while( length > 0x80 )
        {
            stream.WriteByte( (byte) ( length | 0x80 ) );
            length >>= 7;
        }
        stream.WriteByte( (byte) length );
        return stream.ToArray();
    }
}

直接阵列

static byte[] MethodC( int length )
{
    int tmp = length;
    int l = 1;
    while( ( tmp >>= 7 ) > 0 ) ++l;

    var result = new byte[l];
    for( int i = 0; i < l; ++i )
    {
        result[i] = (byte) ( 0x80 | length );
        length >>= 7;
    }

    result[l - 1] &= 0x7f;

    return result;
}

大幅度提升,第三种方法最快(比前两种方法快4-5倍)。当谈到性能关键代码时,创建一个List只是为了把它变成一个数组几乎总是一种气味,这就引起了我的注意。

另外很大一部分时间可能会被吸引到其他地方,这取决于如何使用此方法(例如,如果每次将这个小数组复制到更大的数组中,您可能会删除数组分配完全并直接写入更大的数组中。