我在NetworkStream上使用BinaryReader从网络中读取数据.这对我来说非常有用,但我想了解幕后发生了什么,所以我看了一下BinaryReader的文档,发现它非常稀疏.
我的问题是:BinaryReader.ReadBytes(bufferSize)如果bufferSize我打电话时网络流上没有字节会怎么办ReadBytes?
在我看来,有几个选项:
1)读取网络流上存在的任何字节,只返回那么多
2)等待直到bufferSize流上出现字节,然后读取
3)抛出异常
我假设选项2正在发生,因为我从未收到任何例外,我的所有数据都是全部收到的,而不是碎片.但是,我想知道发生了什么.如果有人能够启发我,我将不胜感激.
由于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) 我遇到了我认为BinaryReader.ReadChars()方法的问题.当我在原始套接字NetworkStream周围包装BinaryReader时偶尔会出现流损坏,其中正在读取的流不同步.所讨论的流包含二进制序列化协议中的消息.
我已将此跟踪到以下内容
我认为发生的事情如下(在下面的例子中)
序列化代码试图解组下一个项目并因为流损坏而呱呱叫.
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)我试图解压缩一个字节数组,并使用二进制读取器将其转换为字符串.执行以下代码时,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) 我正在努力改进使用a的流阅读器类BinaryReader.它由一个while循环组成,用于.PeekChar()检查是否存在更多数据以继续处理.
第一个操作是.ReadInt32()读取4个字节.如果PeekChar只"看到"一个字节(或一位)怎么办?这似乎不是检查EOF的可靠方法.
的BinaryReader是使用其默认参数,其据我所知,使用UTF8作为缺省编码构成.我假设.PeekChar()检查8位但我真的不确定.
.PeekChar()找多少位?(以及检查EOF的其他方法有哪些?)
我有以下来源:
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的当前偏移量.
我试图找出我在这里做错了什么.我正在尝试使用二进制读取器来简化从流中获取初始四个字节到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开始读取.
我正在编写处理使用哈希的文件的代码。我需要读取一个块,然后对其进行哈希处理,然后写入它,然后读取另一个块,等等。
换句话说,我需要做大量的阅读和写作。我确信这真的很简单,但我只是想由专业人士运行它......
是否可能并且可以接受执行以下操作:
BinaryReader br = new BinaryReader (File.OpenRead(path));
BinaryWriter bw = new BinaryWriter (File.OpenWrite(path));
br.dostuff();
bw.dostuff();
Run Code Online (Sandbox Code Playgroud)
我记得在尝试打开和写入文件时遇到了某种冲突的文件流错误,并且我不确定我做了什么来获得它。问题是两个文件流吗?我可以有一个流来读取和写入吗?
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服务器答案的所有精确字节。
那么,从套接字流中缓冲单个字符可能是与时间相关的问题?
我使用围绕构建的网络协议TcpClient,BinaryReader用于从底层读取字节NetworkStream(相反,BinaryWriter用于写入)。
该协议以UTF-8编码传输字符串,并正在调用reader.ReadString()以从流中读取它们(writer.Write(someStr)用于写入)。
是否有一种简单的方法来确定从NetworkStream读取(或写入)的字节数,而不必跳过箍来计算所传输字符串的实际字节长度?
请注意,BinaryWriter.Write()在字符串的实际字节之前写入一个7位编码的整数,这会使任何手动计算变得更加复杂。
另请注意,NetworkStream该Position属性不支持该属性,因为它抱怨无法使用Seek。
此外,我想避免将必须复制/扫描数据的中介引入到读/写过程中,以免影响整个系统的性能。
是否有一种简单,高级的方法来计数通过网络接口传递的字节,而无需手动考虑字符串的编码和长度?
binaryreader ×10
c# ×10
.net ×2
memorystream ×2
stream ×2
binarywriter ×1
filestream ×1
gzipstream ×1
networking ×1
tcpclient ×1