我一直在寻找2小时或更好的方法来使用Read7BitEncodedInt方法.我需要以某种方式使用它来减少我的文件大小(在这种情况下可能减少100mb或更多).我也在考虑使用ReadString方法,因为它似乎做了大致相同的事情.但这似乎不太合适,我不确定它会起作用.如果还有其他替代方案,我不知道我也愿意使用它.
总结.如何将Read7BitEncodedInt方法实现为以下代码?另外,我不太确定我的Write7BitEncodedInt方法也是正确的.
public void SaveFile()
{
using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Create))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
for (int i = 0; i < typeCount.Count; i++)
{
writer.Write((byte)typeCount[i]);
writer.Write(type[i]);
}
writer.Close();
}
}
LoadFile();
}
public void LoadFile()
{
using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Open))
{
using (BinaryReader reader = new BinaryReader(stream))
{
int i = 0;
while (stream.Position != stream.Length)
{
int count = reader.Read7BitEncodedInt();
byte val = reader.ReadByte();
for (int ii = 0; …Run Code Online (Sandbox Code Playgroud) 我正在使用MRIM(Mail.Ru代理)协议.MRIM是一个二进制协议,所以为了使数据成为二进制,我使用的是BinaryWriter类.这是代码:
private byte[] CreateMrimPacket(ulong message)
{
byte[] binaryData;
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bw = new BinaryWriter(ms))
{
bw.Write(CS_MAGIC); //CS_MAGIC is a constant that doesn't equal 0
bw.Write(PROTO_VERSION); //Same thing
bw.Write((ulong)SeqCounter);
bw.Write(message);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
binaryData = new byte[ms.Length];
ms.Read(binaryData, 0, binaryData.Length);
}
}
return binaryData;
}
Run Code Online (Sandbox Code Playgroud)
此函数返回字节数组,但所有值都为0.
请帮我解决这个问题.
提前致谢
也许在Stackoverflow中提出了类似的问题,但我似乎无法找到解决问题的方法.
我只想打开一个可写的二进制流,并能够使用相同的流将数据附加到该文件.显然,如果您打开一个文件进行写入,它将删除它包含的所有数据并启动一个新文件.另外,如果你打开一个文件只是为了阅读,你不能写,但只能阅读.人们确实建议在线使用两个独立的流 - 一个用于阅读,另一个用于写作.我认为在这种情况下不会起作用.
看看我的示例代码,我想做类似的事情:
fs:BinaryWriter;
fs := new BinaryWriter(File.Create('c:\test.dat'));
fs.seek(0,SeekOrigin.End);
fs.Write('test string');
fs.Close;
Run Code Online (Sandbox Code Playgroud) 所以我有以下情况:
--Page.aspx-
UpdatePanel
ListView
UserControl.ascx
Run Code Online (Sandbox Code Playgroud)
--- UserControl.ascx-
ListView
Button|ID:btnDownloadAttachment
Run Code Online (Sandbox Code Playgroud)
我使用以下方法下载附件:
public void OpenDocument(byte[] AttContent, string fileName, string inExtension)
{
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + inExtension);
Response.AddHeader("Content-Length", AttContent.Length.ToString());
Response.BinaryWrite(AttContent);
}
Run Code Online (Sandbox Code Playgroud)
但是由于内容在更新面板中,因此出现以下错误:
“ Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。”
我想在c#中读取文件(图像)和另一个文件视频,并在单个txt文件中保存(写入)两个文件的所有内容(一个接一个).现在我想再次检索第一个图像文件内容和第二个文件内容分开.是否可以读取视频和图像文件以保存在单个文件中.
我试图通过套接字发送一个值.所以我在我的项目客户端和服务器中有两个部分.
客户端使用以下代码向服务器发送值:
NetworkStream networkStream = socketForServer.GetStream();
System.IO.BinaryWriter binaryWriter =
new System.IO.BinaryWriter(networkStream);
//------
int messageSource = 0;
int messageDesitination = 0;
int interlockingId = 0;
int trackId = 0;
int trainId = 2;
int direction = 0;
int messageType = 0;
int informationType = 0;
int dateTime = 0;
foreach (Sensor LeftSensorList in LeftSensor)
{
binaryWriter.Write(messageSource);
binaryWriter.Write(messageDesitination);
binaryWriter.Write(interlockingId);
binaryWriter.Write(trackId);
binaryWriter.Write(trainId);
binaryWriter.Write(direction);
binaryWriter.Write(messageType);
binaryWriter.Write(informationType);
binaryWriter.Write(dateTime);
binaryWriter.Flush();
binaryWriter.Close();
Thread.Sleep(4000);
}
Run Code Online (Sandbox Code Playgroud)
在服务器部分我应该读取二进制值:
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
NetworkStream …Run Code Online (Sandbox Code Playgroud) 我需要创建一个文件,其中某些部分是字符串(utf-8),而某些部分是字节。
我用StreamWriter和修改了几个小时BinaryWriter,但这是唯一有效的:
using (var stream = new FileStream(_caminho, FileMode.Create, FileAccess.Write))
{
using (var writer = new StreamWriter(stream))
{
writer.Write(myString);
}
}
using (var stream = new FileStream(_caminho, FileMode.Append, FileAccess.Write))
{
using (var writer = new BinaryWriter(stream))
{
writer.Write(oneSingleByte);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我必须关闭 FileStream 并打开另一个文件流才能写入单个字节,因为该方法要么BinaryStream.Write(string)在前面添加一个“长度”字段(在我的情况下是不需要的),要么对StreamWriter.Write(byte)字节值进行编码而不是实际直接写入。
我的问题是:是否可以使用另一个类,以便我只能创建一次 FileStream,并依次写入我的字符串和字节?
我正在使用以下代码:
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.
我究竟做错了什么?
我试图将文件添加到Zip文件,保留目录.下面的代码基本上是工作的,只要我没有几个100 Mb的文件压缩.如果我只用一个大约250 Mb的文件压缩一个目录(在一个有足够内存BTW的系统上),我就会得到一个OutOfMemory异常write.Write().
我已经修改了代码以读取块,因为它在读取/写入整个文件时首次失败.我不知道为什么它仍然失败?
using (FileStream zipToOpen = new FileStream(cZipName, eFileMode))
ZipArchiveEntry readmeEntry = archive.CreateEntry(cFileToBackup
);
using (BinaryWriter writer = new BinaryWriter(readmeEntry.Open()))
{
FileStream fsData = null; // Load file into FileStream
fsData = new FileStream(cFileFull, FileMode.Open, FileAccess.Read);
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fsData.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer,0,bytesRead); // here it fails
fsData.Flush(); // ->CHANGED THIS TO writer.Flush() SOLVED IT - nearly..
}
}
fsData.Close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:Arkadiusz …
您好我正在尝试使用BinaryReader/BinaryWriter建立聊天,我陷入了死胡同,我无法弄清楚如何让我的服务器将消息发送给所有连接的客户端..
我已经尝试将所有客户端添加到列表中并在列表上运行foreach循环,以将消息发送到每个连接的客户端,但没有进行锻炼.
服务器:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace server {
internal class Program {
public static int counter = 0;
//List<Client> clientList = new List <Client>();
private static readonly IPAddress sr_ipAddress = IPAddress.Parse("127.0.0.1");
public TcpListener Listener = new TcpListener(sr_ipAddress, 8888);
public static void Main(string[] args) {
Program server = new Program();
server.Start();
Console.ReadKey();
}
public void Start() {
Listener.Start();
Console.WriteLine("Server started");
StartAccept();
}
private void StartAccept() {
Listener.BeginAcceptTcpClient(HandleAsyncConnection, Listener);
}
public void HandleAsyncConnection(IAsyncResult res) …Run Code Online (Sandbox Code Playgroud) binarywriter ×10
c# ×8
binaryreader ×5
.net ×2
7-bit ×1
append ×1
asp.net ×1
binary ×1
delphi-prism ×1
file ×1
filestream ×1
memorystream ×1
parent-child ×1
sockets ×1
streamwriter ×1
tcpclient ×1
updatepanel ×1