标签: binaryreader

C#BinaryReader"流不支持搜索操作"

我试图使用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)

c# ftpwebrequest binaryreader

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

BinaryReader ReadString指定长度?

我正在研究解析器以接收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位部分)?

我正在编写一个协议,需要在将文档传递给客户之前完全理解我正在进行的工作.

c# binaryreader

3
推荐指数
1
解决办法
7757
查看次数

阅读与线BinaryReader在行

我使用下面的代码序列化的数据,从数据表。

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)

.net c# binaryreader

3
推荐指数
1
解决办法
3142
查看次数

在.NET中反序列化以null结尾的字符串的最佳方法是什么?

我正在从我的网络连接中读取一条消息,该消息被序列化为一系列以空字符结尾的字符串(以及其他二进制数据)

我可以使用BinaryReader一次读取一个char,直到找到NULL.

还有一种更有效的方法仍然很简单吗?我期待字符串长度少于64个字符,但它们可能会更长.

.net binaryreader

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

BinaryWriter 问题 - “代码在 Write() 方法之间添加一些字节”

我尝试使用 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)

c# yield-return binaryreader binarywriter

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

为什么Code Analysis告诉我,"不要多次丢弃对象":

在这段代码上:

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# dispose filestream binaryreader visual-studio-2013

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

在C++中是否有一个BinaryReader来读取C#中从BinaryWriter写入的数据?

我已经用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# c++ file-io binaryfiles binaryreader

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

C# 中的 BinaryReader 读取字符串不读取第一个字节

我正在使用 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 和字符串之间没有空字节?

提前致谢。

c# string binaryreader

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

EndOfStreamException,带有简单的BinaryWriter和BinaryReader

我正在使用以下代码:

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.

我究竟做错了什么?

c# serialization memorystream binaryreader binarywriter

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

如何在 C# 中获取解压后的 gzipstream 的位置和长度?

我正在尝试使用二进制阅读器读取 .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 调用

c# gzip binaryreader

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