Я знал, что GetBuffer()
на MemoryStream в С#/.NET должен использоваться с осторожностью, потому что, поскольку документы описывают здесь, в конце могут быть неиспользуемые байты, поэтому вы должны обязательно смотреть только на первые байты MemoryStream.Length в буфере.
Но потом я столкнулся с делом вчера, когда байты в начале буфера были хламами! Действительно, если вы используете инструмент, такой как отражатель, и смотрите ToArray()
, вы можете увидеть это:
public virtual byte[] ToArray()
{
byte[] dst = new byte[this._length - this._origin];
Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0,
this._length - this._origin);
return dst;
}
Чтобы сделать что-либо с буфером, возвращаемым GetBuffer()
, вам действительно нужно знать _origin. Единственная проблема заключается в том, что _origin является закрытым, и нет способа добраться до него...
Итак, мой вопрос: какое использование GetBuffer()
на MemoryStream()
без каких-либо априорных знаний о том, как был создан MemoryStream (что и задает _origin)?
(Именно этот конструктор и только этот конструктор устанавливает начало координат - если вы хотите, чтобы MemoryStream вокруг байтового массива начинался с определенного индекса в массиве байтов:
public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible)
)