我用两个字符串创建了一个字节数组.如何将字节数组转换为字符串?
var binWriter = new BinaryWriter(new MemoryStream());
binWriter.Write("value1");
binWriter.Write("value2");
binWriter.Seek(0, SeekOrigin.Begin);
byte[] result = reader.ReadBytes((int)binWriter.BaseStream.Length);
Run Code Online (Sandbox Code Playgroud)
我想转换result为字符串.我可以用它做BinaryReader.但我不能使用BinaryReader(它不支持).
是否有优雅的模拟StreamReader.ReadToEnd方法BinaryReader?也许将所有字节放入一个字节数组?
我这样做:
read1.ReadBytes((int)read1.BaseStream.Length);
Run Code Online (Sandbox Code Playgroud)
......但必须有更好的方法.
我正在寻找一种方法来检查我是否已经到达我的二进制阅读器的文件的末尾,并且一个建议是使用PeekChar这样
while (inFile.PeekChar() > 0)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,看起来我遇到了一个问题
Unhandled Exception: System.ArgumentException: The output char buffer is too sma ll to contain the decoded characters, encoding 'Unicode (UTF-8)' fallback 'Syste m.Text.DecoderReplacementFallback'. Parameter name: chars at System.Text.Encoding.ThrowCharsOverflow() at System.Text.Encoding.ThrowCharsOverflow(DecoderNLS decoder, Boolean nothin gDecoded) at System.Text.UTF8Encoding.GetChars(Byte* bytes, Int32 byteCount, Char* char s, Int32 charCount, DecoderNLS baseDecoder) at System.Text.DecoderNLS.GetChars(Byte* bytes, Int32 byteCount, Char* chars, Int32 charCount, Boolean flush) at System.Text.DecoderNLS.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteC ount, Char[] chars, Int32 charIndex, Boolean flush) at …
双方StreamReader并BinaryReader可以用来从二进制文件中的数据(例如)
二进制读取器:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
{
byte[] data = new BinaryReader(fs).ReadBytes((int)fs.Length);
Encoding.getstring....
}
Run Code Online (Sandbox Code Playgroud)
StreamReader:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs,Encoding.UTF8))
{
var myString=sr.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,什么时候应该使用哪个?
我正在尝试通过使用程序读取所有不同的信息来提高我对STFS文件格式的理解.使用一个网站,其中包含哪些偏移包含哪些信息,我写了一些有二进制阅读器的代码遍历文件并将值放在正确的变量中.
问题是所有数据都被支持为Big Endian,二进制读取器读取的所有内容都是Little Endian.那么,解决这个问题的最佳方法是什么?
我可以创建一个二进制读取器的模拟类,它返回一个反向的字节数组吗?有什么我可以在类实例中更改它将使它以大端读取,所以我不必重写所有内容?
任何帮助表示赞赏.
编辑:我尝试添加Encoding.BigEndianUnicode作为参数,但它仍然读取小端.
我遇到了一个情况,我有一个非常大的文件,我需要从中读取二进制数据.
因此,我意识到.NET中的默认BinaryReader实现非常慢.用.NET Reflector查看它后,我发现了这个:
public virtual int ReadInt32()
{
if (this.m_isMemoryStream)
{
MemoryStream stream = this.m_stream as MemoryStream;
return stream.InternalReadInt32();
}
this.FillBuffer(4);
return (((this.m_buffer[0] | (this.m_buffer[1] << 8)) | (this.m_buffer[2] << 0x10)) | (this.m_buffer[3] << 0x18));
}
Run Code Online (Sandbox Code Playgroud)
这让我觉得非常低效,想到自32位CPU发明以来计算机是如何设计用于32位值的.
所以我使用这样的代码创建了我自己的(不安全的)FastBinaryReader类:
public unsafe class FastBinaryReader :IDisposable
{
private static byte[] buffer = new byte[50];
//private Stream baseStream;
public Stream BaseStream { get; private set; }
public FastBinaryReader(Stream input)
{
BaseStream = input;
}
public int ReadInt32()
{
BaseStream.Read(buffer, 0, 4);
fixed …Run Code Online (Sandbox Code Playgroud) BinaryReader没有EndOfStream属性.使用以下代码检查是否到达流的末尾是否安全?
reader.BaseStream.Length>reader.BaseStream.Position
我正在尝试自动下载一些pdf文件,给出一个网址列表.
这是我的代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var encoding = new UTF8Encoding();
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb,en;q=0.5");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
BinaryReader reader = new BinaryReader(resp.GetResponseStream());
FileStream stream = new FileStream("output/" + date.ToString("yyyy-MM-dd") + ".pdf",FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
while (reader.PeekChar() != -1)
{
writer.Write(reader.Read());
}
writer.Flush();
writer.Close();
Run Code Online (Sandbox Code Playgroud)
所以,我知道第一部分有效.我最初得到它并使用TextReader读取它 - 但这给了我损坏的pdf文件(因为pdfs是二进制文件).
现在,如果我运行它,reader.PeekChar()总是-1并且没有任何反应 - 我得到一个空文件.
在调试它时,我注意到reader.Read()实际上在我调用时给出了不同的数字 - 所以也许Peek被打破了.
所以我尝试了一些很脏的东西
try
{
while (true)
{
writer.Write(reader.Read()); …Run Code Online (Sandbox Code Playgroud) 我使用以下代码来阅读BigEndian信息,BinaryReader但我不确定它是否是有效的方法.有没有更好的解决方案?
这是我的代码:
// some code to initialize the stream value
// set the length value to the Int32 size
BinaryReader reader =new BinaryReader(stream);
byte[] bytes = reader.ReadBytes(length);
Array.Reverse(bytes);
int result = System.BitConverter.ToInt32(temp, 0);
Run Code Online (Sandbox Code Playgroud) BinaryReader/BinaryWriter可以通过指定Encoding使用for String-related操作来构造.NET 类.
我正在使用扩展方法实现自定义字符串格式,但是Encoding在实例化时它们会以尊重指定的方式实现它们BinaryReader/Writer.
似乎没有办法从读取器/写入器中检索编码,即使从类继承也没有.我只能通过重新创建所有构造函数来继承它们来拦截传递的编码.我查看了.NET源代码,它只用于实例化Decoder类(如果是BinaryReader),但我也无法访问它.
我在这些课程中是否会遇到缺点?我可以用反射入侵它们吗?
binaryreader ×10
c# ×10
.net ×3
endianness ×2
streamreader ×2
arrays ×1
binaryfiles ×1
binarywriter ×1
file ×1
pdf ×1
performance ×1
pointers ×1
stream ×1
streaming ×1
unsafe ×1
webrequest ×1