标签: binaryreader

如果我正在读取的字节不存在,BinaryReader会怎么做?

我在NetworkStream上使用BinaryReader从网络中读取数据.这对我来说非常有用,但我想了解幕后发生了什么,所以我看了一下BinaryReader的文档,发现它非常稀疏.

我的问题是:BinaryReader.ReadBytes(bufferSize)如果bufferSize我打电话时网络流上没有字节会怎么办ReadBytes

在我看来,有几个选项:
1)读取网络流上存在的任何字节,只返回那么多
2)等待直到bufferSize流上出现字节,然后读取
3)抛出异常

我假设选项2正在发生,因为我从未收到任何例外,我的所有数据都是全部收到的,而不是碎片.但是,我想知道发生了什么.如果有人能够启发我,我将不胜感激.

.net c# networking binaryreader

8
推荐指数
1
解决办法
5092
查看次数

当BinaryReader打开时使用Stream.Seek是否安全?

由于BinaryReader的底层缓冲策略,我不清楚是否可以读取存储在流中的偏移量,然后在此偏移量处重新定位流以恢复流式传输.

例如,以下代码是否正常:

using (var reader = new CustomBinaryReader(inputStream))
{
   var offset= reader.ReadInt32();
   reader.BaseStream.Seek(offset, SeekOrigin.Begin);

   //Then resume reading the streaming
}
Run Code Online (Sandbox Code Playgroud)

或者我应该在寻找流之前关闭第一个二进制阅读器,然后重新打开第二个阅读器?

int offset;
using (var firstReader = new CustomBinaryReader(inputStream))
{
   offset= firstReader.ReadInt32();
}
inputStream.Seek(offset, SeekOrigin.Begin);
using (var secondReader = new CustomBinaryReader(inputStream))
{
   //Then resume reading the streaming
}
Run Code Online (Sandbox Code Playgroud)

c# stream binaryreader

8
推荐指数
1
解决办法
6042
查看次数

BinaryReader.ReadChars()的问题

我遇到了我认为BinaryReader.ReadChars()方法的问题.当我在原始套接字NetworkStream周围包装BinaryReader时偶尔会出现流损坏,其中正在读取的流不同步.所讨论的流包含二进制序列化协议中的消息.

我已将此跟踪到以下内容

  • 它只在读取unicode字符串时发生(使用Encoding.BigEndian编码)
  • 只有当有问题的字符串被分成两个tcp数据包时才会发生(使用wireshark确认)

我认为发生的事情如下(在下面的例子中)

  • 调用BinaryReader.ReadChars()要求它读取3个字符(字符串长度在字符串本身之前编码)
  • 第一个循环在内部请求从网络流中读取6个字节(3个剩余字符*2个字节/字符)
  • 网络流只有3个字节可用
  • 3个字节读入本地缓冲区
  • 缓冲区交给解码器
  • 解码器解码1个字符,并将另一个字节保留在它自己的内部缓冲区中
  • 第二个循环内部请求读取4个字节!(2个剩余字符*2个字节/字符)
  • 网络流有4个可用字节
  • 4个字节读入本地缓冲区
  • 缓冲区交给解码器
  • 解码器解码2个字符,并在内部保留剩余的第4个字节
  • 字符串解码完成
  • 序列化代码试图解组下一个项目并因为流损坏而呱呱叫.

    char[] buffer = new char[3];
    int charIndex = 0;
    
    Decoder decoder = Encoding.BigEndianUnicode.GetDecoder();
    
    // pretend 3 of the 6 bytes arrives in one packet
    byte[] b1 = new byte[] { 0, 83, 0 };
    int charsRead = decoder.GetChars(b1, 0, 3, buffer, charIndex);
    charIndex += charsRead;
    
    // pretend the remaining 3 bytes plus a final byte, for something unrelated,
    // arrive next
    byte[] …
    Run Code Online (Sandbox Code Playgroud)

.net c# binaryreader

7
推荐指数
1
解决办法
3549
查看次数

通过BinaryReader将字节数组解压缩为字符串,产生空字符串

我试图解压缩一个字节数组,并使用二进制读取器将其转换为字符串.执行以下代码时,inStream位置从0更改为数组的长度,但str始终为空字符串.

BinaryReader br = null;
string str = String.Empty;

using (MemoryStream inStream = new MemoryStream(pByteArray))
{
    GZipStream zipStream = new GZipStream(inStream, CompressionMode.Decompress);
    BinaryReader br = new BinaryReader(zipStream);
    str = br.ReadString();
    inStream.Close();
    br.Close();
}
Run Code Online (Sandbox Code Playgroud)

c# memorystream gzipstream binaryreader

7
推荐指数
1
解决办法
2万
查看次数

BinaryReader.PeekChar()读取了多少位?

我正在努力改进使用a的流阅读器类BinaryReader.它由一个while循环组成,用于.PeekChar()检查是否存在更多数据以继续处理.

第一个操作是.ReadInt32()读取4个字节.如果PeekChar只"看到"一个字节(或一位)怎么办?这似乎不是检查EOF的可靠方法.

BinaryReader是使用其默认参数,其据我所知,使用UTF8作为缺省编码构成.我假设.PeekChar()检查8位但我真的不确定.

.PeekChar()找多少位?(以及检查EOF的其他方法有哪些?)

c# stream binaryreader

7
推荐指数
1
解决办法
3312
查看次数

我怎么知道C#中BinaryReader的当前偏移量?

我有以下来源:

public static void DisplayValues()
{
    float aspectRatio;
    string tempDirectory;
    int autoSaveTime;
    bool showStatusBar;

    if (File.Exists(fileName))
    {
        using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
        {
            aspectRatio = reader.ReadSingle();
            tempDirectory = reader.ReadString();
    ------------------------------------------------> I want to know current offset.
            autoSaveTime = reader.ReadInt32();
            showStatusBar = reader.ReadBoolean();
        }

        Console.WriteLine("Aspect ratio set to: " + aspectRatio);
        Console.WriteLine("Temp directory is: " + tempDirectory);
        Console.WriteLine("Auto save time set to: " + autoSaveTime);
        Console.WriteLine("Show status bar: " + showStatusBar);
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须找出BinaryReader的当前偏移量.

c# binaryreader

7
推荐指数
1
解决办法
5128
查看次数

C#BinaryReader.Read()以垃圾开头

我试图找出我在这里做错了什么.我正在尝试使用二进制读取器来简化从流中获取初始四个字节到Int32值,该值告诉我其余数据的预期时间.

static void Main(string[] args)
{
    MemoryStream stream = new MemoryStream();

    BinaryWriter writer = new BinaryWriter(stream);

    string s = "Imagine this is a very very long string.";

    writer.Write(s.Length);
    writer.Write(s);
    writer.Flush();

    BinaryReader reader = new BinaryReader(stream);
    reader.BaseStream.Seek(0, SeekOrigin.Begin);

    char[] aChars = new char[reader.ReadInt32()];
    reader.Read(aChars, 0, aChars.Length);
    Console.WriteLine(new string(aChars));
}
Run Code Online (Sandbox Code Playgroud)

输出应该是输入,但我得到这个(注意第一个字符从字符串更改为字符串)

(想象一下,这是一个非常长的字符串

有人可以向我解释我做错了什么吗?理想情况下,第二次读取将继续,直到总读取字节数等于前四个字节的值.此代码只是一个简化,以显示我遇到的问题.流的位置似乎是正确的(4)但它几乎看起来像是从2开始读取.

c# memorystream binaryreader

6
推荐指数
1
解决办法
4148
查看次数

二进制读取器和写入器同时打开?

我正在编写处理使用哈希的文件的代码。我需要读取一个块,然后对其进行哈希处理,然后写入它,然后读取另一个块,等等。

换句话说,我需要做大量的阅读和写作。我确信这真的很简单,但我只是想由专业人士运行它......

是否可能并且可以接受执行以下操作:

BinaryReader br = new BinaryReader (File.OpenRead(path));
BinaryWriter bw = new BinaryWriter (File.OpenWrite(path));
br.dostuff();
bw.dostuff();
Run Code Online (Sandbox Code Playgroud)

我记得在尝试打开和写入文件时遇到了某种冲突的文件流错误,并且我不确定我做了什么来获得它。问题是两个文件流吗?我可以有一个流来读取和写入吗?

c# filestream binaryreader binarywriter

5
推荐指数
1
解决办法
5075
查看次数

C#BinaryReader.ReadChar在读取NetworkStream时抛出“ System.ArgumentException:输出char缓冲区太小”

NetworkStream从流类型的TCP套接字读取C#时,BinaryReader.ReadChar偶尔会引发异常System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)'

所有缓冲区都有其默认大小(没有一个是手动设置的),并且设置更大的缓冲区大小不会影响该问题。

完全令人沮丧的是:

  • 使用断点并逐步通过ReadCharcall 行时,不会发生异常

  • 如果ReadChar先于该异常,则不会发生该异常Thread.Sleep(1000)(但仍会在较小的超时时发生)

  • 使用BinaryReaderon 时不会发生异常FileStream,在该位置存储了TCP服务器答案的所有精确字节。

那么,从套接字流中缓冲单个字符可能是与时间相关的问题?

c# networkstream binaryreader

5
推荐指数
1
解决办法
7962
查看次数

TcpClient通过NetworkStream BinaryReader / BinaryWriter传输的字节计数

我使用围绕构建的网络协议TcpClientBinaryReader用于从底层读取字节NetworkStream(相反,BinaryWriter用于写入)。

该协议以UTF-8编码传输字符串,并正在调用reader.ReadString()以从流中读取它们(writer.Write(someStr)用于写入)。

是否有一种简单的方法来确定从NetworkStream读取(或写入)的字节数,而不必跳过箍来计算所传输字符串的实际字节长度?

请注意,BinaryWriter.Write()在字符串的实际字节之前写入一个7位编码的整数,这会使任何手动计算变得更加复杂。

另请注意,NetworkStreamPosition属性不支持该属性,因为它抱怨无法使用Seek

此外,我想避免将必须复制/扫描数据的中介引入到读/写过程中,以免影响整个系统的性能。

是否有一种简单,高级的方法来计数通过网络接口传递的字节,而无需手动考虑字符串的编码和长度?

c# network-programming networkstream tcpclient binaryreader

5
推荐指数
1
解决办法
483
查看次数