我正在编写处理使用哈希的文件的代码。我需要读取一个块,然后对其进行哈希处理,然后写入它,然后读取另一个块,等等。
换句话说,我需要做大量的阅读和写作。我确信这真的很简单,但我只是想由专业人士运行它......
是否可能并且可以接受执行以下操作:
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服务器答案的所有精确字节。
那么,从套接字流中缓冲单个字符可能是与时间相关的问题?
我有以下代码:
using (BinaryReader br = new BinaryReader(
File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
int pos = 0;
int length = (int) br.BaseStream.Length;
while (pos < length)
{
b[pos] = br.ReadByte();
pos++;
}
pos = 0;
while (pos < length)
{
Console.WriteLine(Convert.ToString(b[pos]));
pos++;
}
}
Run Code Online (Sandbox Code Playgroud)
FILE_PATH是一个const字符串,包含要读取的二进制文件的路径.二进制文件是整数和字符的混合.整数是每个1个字节,每个字符作为2个字节写入文件.
例如,该文件包含以下数据:
1HELLO你是如何看待你的//等等
请注意:每个整数都与其后面的字符串相关联.所以1与"HELLO HOW ARE YOU"有关,45与"你在寻找伟大"等等有关.
现在写二进制文件(我不知道为什么,但我必须忍受这个),这样"1"只需要1个字节,而"H"(和其他字符)每个需要2个字节.
所以这是文件实际包含的内容:
0100480045 ......依此类推:
01是整数1的第一个字节0048是'H'的2个字节(H是十六进制的48)0045是'E'的2个字节(E = 0x45)
我希望我的控制台能够从这个文件中打印出人类可读的格式:我希望它打印出"1你好如何",然后"45你看起来很棒"等等......
我正在做的是正确的吗?有更简单/有效的方法吗?我的行Console.WriteLine(Convert.ToString(b [pos])); 什么都不做,但打印整数值,而不是我想要的实际字符.对于文件中的整数是可以的,但是如何读出字符呢?
任何帮助将非常感激.谢谢
C#的新手,并试图扩大我的能力.我在VB中有这个代码:
Private Sub BreakdownFilesToCompare(ByRef file1BReader As BinaryReader, _
ByRef file2BReader As BinaryReader, _
ByRef firstFile As StandardFormatFile, _
ByRef secondFile As StandardFormatFile)
file1BReader.ReadInt32()
file2BReader.ReadInt32()
firstFile.numberOfSeries = file1BReader.ReadInt32
secondFile.numberOfSeries = file2BReader.ReadInt32
If firstFile.numberOfSeries <> secondFile.numberOfSeries Then
WriteToConsole("The number of Elements the two files do not match...Stopping")
Exit Sub
End If
For i As Integer = 0 To firstFile.numberOfSeries - 1
Dim tempSeriesData1 As New StandardFormatFileSeries
Dim tempSeriesData2 As New StandardFormatFileSeries
tempSeriesData1.standardNumOfElements = file1BReader.ReadInt32
tempSeriesData1.standardSeriesName = GetSeriesName(file1BReader)
tempSeriesData2.standardNumOfElements = file2BReader.ReadInt32
tempSeriesData2.standardSeriesName = …Run Code Online (Sandbox Code Playgroud) 案例:
再次尝试通过我的NIC捕获数据包,
我开发了2个Extensions用于捕获可变数量的位
public static string ReadBits ( this BinaryReader Key , int Value )
{
BitArray _BitArray = new BitArray ( Value );
for ( int Loop = 0 ; Loop > Value ; Loop++ )
{
/* Problem HERE ---> */ _BitArray [ Loop ] = Key . ReadBoolean ( );
}
return BitConverter . ToString ( _BitArray . ToByteArray ( ) );
}
public static byte [ ] ToByteArray ( this BitArray Key )
{
byte [ …Run Code Online (Sandbox Code Playgroud) 与HxD编辑器中的相同功能非常相似,我正在实现一个程序,该程序在大二进制文件(> 1 GB)中搜索特定的十六进制值(比如32位).内存是有限的,似乎按块读取块是非常慢的BinaryReader类.HxD在大约12秒内返回搜索结果(几乎达到文件末尾),这是可以接受的.
是否可以在一次调用中从二进制文件中读取结构数组?
例如,我有一个包含数千个顶点的文件:
struct Vector3 { float x, y, z; }
我需要C#端口作为C++代码:
Vector3 *verts = new Vector3[num_verts];
fread ( verts, sizeof(Vector3), num_verts, f );
Run Code Online (Sandbox Code Playgroud) 我有一个 PHP 类,用于读取我正在转换为 NodeJS 的二进制数据或在 NodeJS 中找到等效的几个函数。我对这个 BinaryReader 类感兴趣的函数是ReadULong和ReadUShort。我相信这些意味着读取无符号长整数(4 个字节)和无符号短整数(2 个字节)。当我试图在 NodeJS 中找到这些的等价物时,我对在这些之间使用哪个函数感到困惑:
buf.readUInt16LE(offset, [noAssert])
buf.readUInt16BE(offset, [noAssert])
buf.readUInt32LE(offset, [noAssert])
buf.readUInt32BE(offset, [noAssert])
Run Code Online (Sandbox Code Playgroud)
在这种情况下会LE或BE代表什么?
另外,我在 PHP 类上发现了一个常量,上面写着const DEFAULT_BYTE_ORDER = 'L';. 这是L相同L的readUInt32LE?这是关于字节顺序的全部内容吗?
到目前为止,我已经阅读了这些文章:
如果我能得到更多关于二进制阅读的参考资料,我将不胜感激!
当我发现奇怪的东西时,我正在修补IP数据包'解析器'.
在解析IP地址时,在C#中
private uint srcAddress;
// stuff
srcAddress = (uint)(binaryReader.ReadInt32());
Run Code Online (Sandbox Code Playgroud)
诀窍,所以你认为这个VB.Net等效
Private srcAddress As UInteger
'' stuff
srcAddress = CUInt(binaryReader.ReadInt32())
Run Code Online (Sandbox Code Playgroud)
也会做的伎俩.它没有.这个 :
srcAddress = reader.ReadUInt32()
Run Code Online (Sandbox Code Playgroud)
但是会的.
花了一些时间发现,但我发现了什么 - 如果有的话?为什么是这样 ?
我正在尝试读取由C ++程序制成的二进制文件。该文件有一些数字,当我尝试读取它们时,我得到了错误的值。double double
这是从文件读取的十六进制值:
00-67-CC-02-B3-F7-40-CA
Run Code Online (Sandbox Code Playgroud)
期望值:
0.2051076530529798
Run Code Online (Sandbox Code Playgroud)
实际值:
-4.9596277989715114E+49
Run Code Online (Sandbox Code Playgroud)
二进制文件类型:double 8字节(c ++)
在转换输出C# :()doublebinaryreader.ReadDouble()
这是代码:
reader = new BinaryReader(File.Open(path, FileMode.Open), Encoding.Default);
double value = reader.ReadDouble();
Run Code Online (Sandbox Code Playgroud)
我已经检查过,我在正确的位置使用此命令。为什么我有这种不同的价值?
binaryreader ×10
c# ×9
.net ×1
binarystream ×1
binarywriter ×1
bitarray ×1
buffer ×1
c++ ×1
filestream ×1
node.js ×1
uint32 ×1
vb.net ×1