快速提问。我正在尝试通过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();
}
答案 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();
}
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
只是为了把它变成一个数组几乎总是一种气味,这就引起了我的注意。
另外很大一部分时间可能会被吸引到其他地方,这取决于如何使用此方法(例如,如果每次将这个小数组复制到更大的数组中,您可能会删除数组分配完全并直接写入更大的数组中。