在C#中,什么是Java的ByteBuffer.wrap的等价物?

siotufzp  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(166)
byte[] input = new byte[] {2, 4, 5, 2, 1};
ByteBuffer bytebuf = ByteBuffer.wrap(input);

ByteBuffer.wrap(byte[] array)方法使缓冲区和数组互连,修改缓冲区将导致数组被修改,反之亦然。
ByteBuffer在C#中的等价物是memorystream,但是我不知道如何像ByteBuffer.wrap()方法那样将memorystream与数组连接起来。
有没有人能说出C#中ByteBuffer.wrap()的等价物是什么?我到处找都找不到答案。
先谢了。

w6lpcovy

w6lpcovy1#

Use a binary writer and a memory stream.
我没有将这个问题标记为重复,仅仅是因为您没有准确地问另一个发帖者做了什么。我不知道在这种情况下该怎么做,但仍然希望能帮助您。祝您好运!
以下是该链接的代码,以供后人参考:

MemoryStream stream = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(stream))
{
    writer.Write(myByte);
    writer.Write(myInt32);
    writer.Write("Hello");
}
byte[] bytes = stream.ToArray();
ss2ws0br

ss2ws0br2#

wrap等效的是使用MemoryStream的构造函数,该构造函数接受byte[]MemoryStream(byte[])。这“ Package ”了原始数组,因此是一个固定大小的缓冲区。

byte[] input = new byte[] {2, 4, 5, 2, 1};
using var ms = new MemoryStream(input);

与另一个答案不同的是,这保留了数组的内容(如果您想从中读取,这一点很重要),并且不创建任何副本,我理解这是您问题的重点。
否则,要在缓冲区/流中读/写逻辑值,答案与现有答案大致相同:使用StreamWriter和/或StreamReader

using (var bw = new BinaryWriter(ms, Encoding.UTF8, leaveOpen: true))
{
    bw.Write(12356789);
    
    try
    {
        bw.Write(12356789); // additional write will throw due to lack of space
    }
    catch {}
}

using (var br = new BinaryReader(ms, Encoding.UTF8, leaveOpen: true))
{
    // reset position before reading
    ms.Position = 0;
    Console.WriteLine(br.ReadInt32());
}

// check we modified the original buffer (ToArray would return a copy)
Console.WriteLine(String.Join(", ", input));

相关问题