使用 C# 将字符串写入二进制文件时,长度(以字节为单位)会自动添加到输出中。根据MSDN 文档,这是一个无符号整数,但也是一个字节。他们给出的示例是,单个 UTF-8 字符将由三个写入字节组成:1 个大小字节和 2 个字符字节。这对于长度不超过 255 的字符串来说很好,并且与我观察到的行为相匹配。
但是,如果字符串长度超过 255 个字节,则无符号整数的大小会根据需要增加。作为一个简单的示例,将 1024 个字符视为:
string header = "ABCDEFGHIJKLMNOP";
for (int ii = 0; ii < 63; ii++)
{
header += "ABCDEFGHIJKLMNOP";
}
fileObject.Write(header);
Run Code Online (Sandbox Code Playgroud)
结果在字符串前面添加了 2 个字节。创建 2^17 长度的字符串会产生一个有点令人抓狂的 3 字节数组。
因此,问题是如何知道读取多少字节才能获得读取时后续内容的大小?我不一定先验地知道标头大小。最终,我可以强制 Write(string) 方法始终使用一致的大小(例如 2 个字节)吗?
一个可能的解决方法是编写我自己的 write(string) 方法,但出于明显的原因我想避免这种情况(类似的问题在这里和这里接受此作为答案)。另一种更容易接受的解决方法是让读者查找启动 ASCII 字符串信息的特定字符(可能是不可打印的字符?),但这并非绝对正确。最后的解决方法(我能想到的)是强制字符串处于特定大小字节的大小范围内;再说一遍,这并不理想。
虽然强制字节数组的大小保持一致是最简单的,但我可以控制读取器,因此也欢迎任何聪明的读取器解决方案。
我们在 win7 上使用 git 和 gitExtension。有时我们需要使用 Excel 表格。我根据以下内容编辑了 .gitattributes 和 .git/config: Git Diff Indent/Pretty Print/Beautify Before Diff
作为转换器,我使用 VBS 脚本(它基于: http: //developer.rhino3d.com/guides/rhinoscript/reading-excel-files/ )和 cscript.exe
当在 gitExtension 中运行:Git bash 和命令:git diff file.xls 时,它会按我的预期显示更改。但在扩展中我可以看到 file.xls 已更改,但缺少 git diff 之类的比较。什么也没有——只有空荡荡的窗户。在编辑 .gitattributes 和 .git/config 之前,它(在此窗口中)显示它是二进制文件并且已更改。
任何人都可以帮助我如何设置 Git 扩展来显示 xls 文件和差异的文本解释(根据 vbs 脚本)内容。
经过几条评论后,我添加了 Git bash 的打印屏幕 - 您可以在这里看到它的一些工作原理(也许某些特殊字符存在问题,这些字符在控制台中显示为 < D8 > 或 ^M)

我还研究了 git-extension 命令日志。在那里我可以看到它使用命令:
git diff --unified=3 -- TCs/pokusna_tabulka.xls
Run Code Online (Sandbox Code Playgroud)
在 git bash 中有效
我想在 vs code 中显示二进制文件的一些信息。是否可以为 VS Code 编写一个扩展名,以便在资源管理器中选择该文件(或直接打开它)时,您会看到该扩展名从二进制文件中提取的一些文本?
因此,该扩展的核心功能将是(简化的)二进制到文本转换器。
有什么建议么?
我正在尝试将二进制文件上传到 postgres 服务器。我认为我正确地修改了Python脚本(https://gist.github.com/illume/8aa7c2d03273da846bf4361236a4f3f9#file-image_save-py),以便它将连接到我的postgres服务器,但我一直试图在命令行。据我了解,我需要导航到包含 image_save.py 脚本的目录并调用它。我还在同一目录中放置了一个测试文件,因此我尝试执行:
python image_save.py shuttle.jpg
Run Code Online (Sandbox Code Playgroud)
为此,我收到此错误:“错误:需要参数之一 --store --fetch 。”
然后我尝试:
python image_save.py --store shuttle.jpg
Run Code Online (Sandbox Code Playgroud)
我有:
Traceback (most recent call last):
File "image_save.py", line 45, in <module>
main(sys.argv)
File "image_save.py", line 30, in main
curs.execute("INSERT INTO files(id, orig_filename, file_data) VALUES (DEFAULT,%s,%s) RETURNING id", (args.filename, filedata))
ValueError: A string literal cannot contain NUL (0x00) characters.
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
python -m image_save.py shuttle.jpg
Run Code Online (Sandbox Code Playgroud)
我得到“C:\Python27\python.exe: 没有名为 image_save.py 的模块”
我真的认为我只是错误地调用了脚本。谁能看到我做错了什么吗?
尝试使用 PySpark 处理大型二进制文件,但总是出现 OutofMemoryError。尝试了所有可能的方法,例如增加执行器/驱动程序内存、重新分区 rdd。单个大型二进制文件会在 Spark 中进行分区吗?如果没有,我们如何处理二进制文件。我当前使用的二进制文件超过2GB。
我目前正在研究DOCSIS及相关的一些内部工作原理。我有点困惑的一件事是如何制作电缆调制解调器配置文件。
根据我收集到的信息:
I'm interested in knowing how these config files are structured. I have next to no knowledge of TLV aside from what I've read these past days.
我有以下代码片段,用于读取二进制文件并验证它:
FileStream f = File.OpenRead("File.bin");
MemoryStream memStream = new MemoryStream();
memStream.SetLength(f.Length);
f.Read(memStream.GetBuffer(), 0, (int)f.Length);
f.Seek(0, SeekOrigin.Begin);
var r = new BinaryReader(f);
Single prevVal=0;
do
{
r.ReadUInt32();
var val = r.ReadSingle();
if (prevVal!=0) {
var diff = Math.Abs(val - prevVal) / prevVal;
if (diff > 0.25)
Console.WriteLine("Bad!");
}
prevVal = val;
}
while (f.Position < f.Length);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它运行速度非常慢,我正在寻求改进。在 C++ 中,我只需将文件读入字节数组,然后将该数组重新转换为结构数组:
struct S{
int a;
float b;
}
Run Code Online (Sandbox Code Playgroud)
我将如何在 C# 中执行此操作?
我可能不会在正确的位置问这个问题,但是在某个地方我可以研究可执行二进制文件的结构是什么吗?如,代码的组织方式,符号的存储位置等.
我有一大堆需要处理的文本文件.现在表现非常好,多亏了pmap(),但我正在寻找额外的加速.当前的瓶颈是将字符串解析为浮点数.
我想到了加载我的数据(管道分隔的文本文件)并将它们写成二进制格式.从我所看到的,Julia应该能够以这种方式更快地加载我的数据.问题是我在将二进制数据写成二进制文件后将其加载回Julia的正确方法遇到了一些麻烦.
这是我用于加载,解析和写入二进制文件的一些示例代码:
input_file = "/cool/input/file.dat" ## -- pipe delimited text file of Floats
output_file = "/cool/input/data_binary"
open(input_file, "r") do in_file
open(output_file, "w") do out_file
for line in eachline(in_file)
split_line = split(line, '|')
out_float = parse(Float64, split_line[4])
write(out_file, out_float)
end
end
end
Run Code Online (Sandbox Code Playgroud)
问题是,当我将上述文件加载到Julia时,我不知道值是什么:
read(output_file)
n-element Array{UInt8,1}:
0x00
0x00
0x00
0x00
0x00
0x80
0x16
Run Code Online (Sandbox Code Playgroud)
如何在Julia代码中将这些二进制值用作浮点数?更一般地说,如果我正在寻找性能提升,以这种方式将我的文本文件数据转换为二进制文件是否有意义?
binaryfiles ×10
binary ×2
c# ×2
android ×1
apache-spark ×1
assembly ×1
executable ×1
git ×1
julia ×1
optimization ×1
postgresql ×1
psql ×1
pyspark ×1
python ×1
shader ×1
size ×1
string ×1
tlv ×1
xls ×1