我试图使用C#和ftpwebrequest从ftp服务器下载文件.我可以使用BinaryReader获取字节,但是当我尝试使用br.ReadBytes(int)读取流时,我得到一个BinaryReader不支持搜索操作的错误.
有谁知道如何最好地读取字节,以便我可以将它们写入文件?
这是完整的方法:
public void DownloadFile(String fileName)
{
Logger.Info("starting to download file: " + fileName);
try
{
var downloadFileRequest = (FtpWebRequest)WebRequest.Create(FtpServer + "//" + fileName);
downloadFileRequest.Credentials = new NetworkCredential(FtpUsername,FtpPassword);
downloadFileRequest.Method = WebRequestMethods.Ftp.DownloadFile;
downloadFileRequest.UseBinary = true;
ServicePoint sp = downloadFileRequest.ServicePoint;
sp.ConnectionLimit = 2;
Logger.Info("getting ftp response for download file for " + fileName);
try
{
var downloadResponse = (FtpWebResponse)downloadFileRequest.GetResponse();
Logger.Info("getting ftp response stream for " + fileName);
try
{
Stream downloadStream = downloadResponse.GetResponseStream();
Logger.Info("File Download status: {0}", downloadResponse.StatusDescription.Trim());
Logger.Info("getting binary reader …Run Code Online (Sandbox Code Playgroud) 我正在研究解析器以接收UDP信息,解析它并存储它.为此,我使用的是BinaryReader因为它主要是二进制信息.其中一些将是字符串.MSDN说的ReadString()功能:
从当前流中读取字符串.该字符串以长度为前缀,一次编码为整数7位.
我完全理解它,直到"一次七位",我试图忽略,直到我开始测试.我在创建自己的字节数组之前将其放入a MemoryStream并尝试使用a读取它BinaryReader.这是我最初认为会起作用的:
byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', }
BinaryReader reader = new BinaryReader(new MemoryStream(data));
String str = reader.ReadString();
Run Code Online (Sandbox Code Playgroud)
知道一个int是4个字节(并且足够长时间找到它BinaryReader是Little Endian)我传给它3的长度和相应的字母.然而str最终举行\0\0\0.如果我删除3个零并且只是
byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', }
Run Code Online (Sandbox Code Playgroud)
然后它Cat正确地读取和存储.对我来说,这与文档冲突说长度应该是一个整数.现在我开始认为它们只是指一个没有小数位而不是数据类型的数字int.这是否意味着a BinaryReader永远不会读取大于127个字符的字符串(因为那将是01111111,对应于文档的7位部分)?
我正在编写一个协议,需要在将文档传递给客户之前完全理解我正在进行的工作.
我使用下面的代码序列化的数据,从数据表。
var rows = new List<Dictionary<string, object[]>>();
Run Code Online (Sandbox Code Playgroud)
我从数据表中填写的行并将它们放在字典。不要问为什么:)
using(var fileStream = new FileStream(@"D:\temp.bin", FileMode.Create, FileAccess.Write, FileShare.None))
using(var bw = new BinaryWriter(fileStream))
{
foreach(Dictionary<string, object[]> row in rows)
{
byte[] bytes = ObjectToByteArray(row);
bw.Write(bytes);
}
}
Run Code Online (Sandbox Code Playgroud)
随着下面的方法:
private static byte[] ObjectToByteArray(Dictionary<string, object[]> rows)
{
var bf = new BinaryFormatter();
using(var ms = new MemoryStream())
{
bf.Serialize(ms, rows);
return ms.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图做的是逐行反序列化,如果使用BinaryReader可以的话。问题是,我坚持只读取第一行。
我想实现的是:
using(BinaryReader reader = new BinaryReader(File.Open(@"D:\temp.bin", FileMode.Open)))
{
int pos = 0;
int length = (int)reader.BaseStream.Length;
while(pos < length) …Run Code Online (Sandbox Code Playgroud) 我正在从我的网络连接中读取一条消息,该消息被序列化为一系列以空字符结尾的字符串(以及其他二进制数据)
我可以使用BinaryReader一次读取一个char,直到找到NULL.
还有一种更有效的方法仍然很简单吗?我期待字符串长度少于64个字符,但它们可能会更长.
我尝试使用 BinaryWriter 然后使用 BinaryReader 编写一些代码。当我想写时,我使用 Write() 方法。但问题是,在 Write 方法的两行之间出现了一个新字节,该字节在 ASCII 表中为十进制 31(sometines 24)。你可以在这张图片上看到它:

您可以看到索引 4 处的字节(第 5 个字节)的 ASCII 十进制值是 31。我没有在那里插入它。正如您所看到的,第一个 4 个字节是为数字(Int32)保留的,接下来是其他数据(主要是一些文本 - 现在这并不重要)。
正如您从我编写的代码中看到的: - 在第一行输入数字 10 - 在第二行文本“这是一些文本...”
第 5 个字节(12 月 31 日)是怎么出现在中间的?
这是我的代码:
static void Main(string[] args)
{
//
//// SEND - RECEIVE:
//
SendingData();
Console.ReadLine();
}
private static void SendingData()
{
int[] commandNumbers = { 1, 5, 10 }; //10 is for the users (when they send some text)!
for (int i …Run Code Online (Sandbox Code Playgroud) 在这段代码上:
public static string Base64FromFileName(string fileName)
{
try
{
FileInfo fInfo = new FileInfo(fileName);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fStream);
byte[] bdata = br.ReadBytes((int)numBytes);
br.Close();
fStream.Close();
return Convert.ToBase64String(bdata);
}
catch(Exception e)
{
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
...我得到了Visual Studio的代码分析工具,警告," 不要多次丢弃对象......为了避免生成System.ObjectDisposedException,你不应该在对象上多次调用Dispose " fStream.Close();" 线.
为什么?fStream是否在上面的行中,BinaryReader关闭了?
无论如何,我不会更好地重构它:
. . .
using (FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (BinaryReader br = new BinaryReader(fStream))
{
byte[] bdata = br.ReadBytes((int)numBytes);
} //br.Close();
} …Run Code Online (Sandbox Code Playgroud) 我已经用C#中的BinaryWriter写了几个整数,char []和其他数据文件.使用BinaryReader读回(在C#中)文件,我可以完美地重新创建文件的所有部分.
但是,试图用C++重新读取它们会产生一些可怕的结果.我正在使用fstream尝试回读数据并且数据未正确读取.在C++中,我设置了一个fstream ios::in|ios::binary|ios::ate并使用seekg来定位我的位置.然后我读取接下来的四个字节,它们写成整数"16"(并正确读入C#).这在C++中读作1244780(不是内存地址,我检查过).为什么会这样?在C++中是否有与BinaryReader相同的东西?我注意到它在msdn上提到过,但是对我来说,Visual C++和intellisense看起来并不像c ++.
编写文件的示例代码(C#):
public static void OpenFile(string filename)
{
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);
}
public static void WriteHeader()
{
w.Write('A');
w.Write('B');
}
public static byte[] RawSerialize(object structure)
{
Int32 size = Marshal.SizeOf(structure);
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(structure, buffer, true);
byte[] data = new byte[size];
Marshal.Copy(buffer, data, 0, size);
Marshal.FreeHGlobal(buffer);
return data;
}
public static void WriteToFile(Structures.SomeData data)
{
byte[] buffer = Serializer.RawSerialize(data);
w.Write(buffer);
}
Run Code Online (Sandbox Code Playgroud)
我不确定如何向您显示数据文件.
读取数据的示例(C#):
BinaryReader reader = new …Run Code Online (Sandbox Code Playgroud) 我正在使用 C# 中的 System.IO 中的 BinaryReader 读取二进制文件,但是,当使用 ReadString 时,它不会读取第一个字节,代码如下:
using (var b = new BinaryReader(File.Open(open.FileName, FileMode.Open)))
{
int version = b.ReadInt32();
int chunkID = b.ReadInt32();
string objname = b.ReadString();
}
Run Code Online (Sandbox Code Playgroud)
这并不难,首先它读取两个整数,但应该返回 objame 的字符串是“bat”,而它返回的是“at”。
这与我读过的前两个整数有关系吗?或者可能是因为第一个 int 和字符串之间没有空字节?
提前致谢。
我正在使用以下代码:
var fileStream = new MemoryStream();
var binaryWriter = new BinaryWriter(fileStream);
var binaryReader = new BinaryReader(fileStream);
binaryWriter.Write("Hello");
var msg = binaryReader.ReadString();
Run Code Online (Sandbox Code Playgroud)
但是我得到以下异常:
System.IO.EndOfStreamException: Unable to read beyond the end of the stream.
Run Code Online (Sandbox Code Playgroud)
在读取之前,binaryReader.BaseStream.Length大于0,但binaryReader.PeekChar()返回-1.
我究竟做错了什么?
我正在尝试使用二进制阅读器读取 .gz 文件,首先使用 gzipstream 解压缩,然后使用 gzipstream 创建一个新的二进制阅读器。但是,当我尝试使用 BinaryReader 的 BaseStream.Position 和 BaseStream.Length (以了解我何时到达文件末尾)时,我收到 NotSupportedException,检查 GZipStream 类中这些字段的文档显示:
Length
不支持此属性,并且始终抛出 NotSupportedException。(重写 Stream.Length。)
位置
不支持此属性,并且始终抛出 NotSupportedException。(重写 Stream.Position。)
所以我的问题是,当使用 BinaryReader 读取解压缩的 GZipStream 时,如何知道何时到达文件末尾?谢谢
这是我的代码:
Stream stream = new MemoryStream(textAsset.bytes);
GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress);
using (BinaryReader reader = new BinaryReader(zippedStream))
while(reader.BaseStream.Position != reader.BaseStream.Length)
{
//do stuff with BinaryReader
}
Run Code Online (Sandbox Code Playgroud)
上面抛出:NotSupportedException:不支持操作。System.IO.Compression.DeflateStream.get_Position()
由于 while() 中的 BaseStream.Position 调用
binaryreader ×10
c# ×9
.net ×2
binarywriter ×2
binaryfiles ×1
c++ ×1
dispose ×1
file-io ×1
filestream ×1
gzip ×1
memorystream ×1
string ×1
yield-return ×1