当我在 Ada 中调用 Write 来序列化记录时,我希望能够预测生成的二进制文件中的内容。你知道我在哪里可以查到这个吗?
我有一些遗留的 Ada 软件,它通过写入记录来生成二进制文件,我需要调试一个应该编写兼容二进制文件的 C++ 程序。所以,我想了解 Ada 在序列化记录时遵循什么规则,以便我可以确保 C++ 代码将生成功能等效的记录。
在ELF文件格式中,我们有一个Alignment字段,Segment Header Table即Program Header Table.
在 Windows PE 文件格式的情况下,他们将其带到下一个级别,节有两个对齐值,一个在磁盘文件中,另一个在内存中。PE 文件头指定了这两个值。
我对这种对齐一无所知。我们需要它做什么?如何以及在哪里使用它?同样,我不知道什么是二进制文件格式上下文中的对齐,但我们为什么需要它?
我无法理解二进制格式的性质及其在 R 中的用处,所以我做了一些实验:
在 R 中:
y1 = rbind(c('a', 'b'), c('c', 'd'))
write.table(y1, 'f1', quote=F, col.names=F, row.names=F)
conn = file('f2', 'wb')
writeBin('a b\nc d\n', conn)
close(conn)
Run Code Online (Sandbox Code Playgroud)
在 bash 中:
cat f1
# a b
# c d
cat f2
# a b
# c d
Run Code Online (Sandbox Code Playgroud)
这些看起来完全一样,但如果我区分它们:
diff f1 f2
# Binary files f1 and f2 differ
Run Code Online (Sandbox Code Playgroud)
diff 并没有告诉我有什么区别。
那么回到主题,什么是二进制文件(毕竟在 PC 上一切都是二进制文件),我应该在什么情况下在 R 中使用它?
fread(cur, 2, 1, 鳍)
我相信当我得到这个答案时我会觉得自己很愚蠢,但是发生了什么?
cur 是一个指向 code_cur 的指针,一个短的(2 个字节),fin 是一个为二进制读取而打开的流。
如果我的文件是 00101000 01000000
我最终得到的是
code_cur = 01000000 00101000
Run Code Online (Sandbox Code Playgroud)
这是为什么?我还没有举办任何比赛,因为问题确实归结为这种(至少对我而言)意外的行为。
而且,如果这是常态,我怎样才能获得预期的效果?
聚苯乙烯
我应该补充一点,为了“查看”字节,我正在打印它们的整数值。
printf("%d\n",code_cur)
Run Code Online (Sandbox Code Playgroud)
我试了几次,看起来很可靠。
我需要从二进制文件中提取数据。
我用过binaryRecords并得到了RDD[Array[Byte]]。
从这里我想将每条记录解析为
case class (Field1: Int, Filed2 : Short, Field3: Long)
我怎样才能做到这一点?
我有一个叫做product 的结构,我试图从一个二进制文件中读取它来填充这个函数:
void reading(FILE *fp){
Product *obuff = malloc(sizeof(Product));
fread(obuff->code, sizeof(obuff->code), 1, fp);
fread(obuff->name, sizeof(obuff->name), 1, fp);
fread(obuff->quantity, sizeof(obuff->quantity), 1, fp);
fread(obuff->price, sizeof(obuff->price), 1, fp);
printf("%s %s %d %.2f\n", obuff.code, obuff.name, obuff.quantity, obuff.price);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到错误消息,说由于错误的数据类型而无法传递参数。有没有办法从二进制文件中读取结构,或者我只是在这里做错了什么?
结构:
#pragma pack(2)
struct product {
char code[15];
char name[50];
short int quantity;
double price;
};
#pragma pack()
typedef struct product Product;
Run Code Online (Sandbox Code Playgroud) 我正在尝试打开并读取一堆二进制格式的地理参考时间日志文件。他们应该遵循农业机械的 ISO-11783 (ISOBUS) 标准,但在阅读了 100 多页标准后,我无法弄清楚如何使用十六进制编辑器或以编程方式使用 .NET c# 读取文件。我知道时间日志以文件对的形式出现:一个 xml 文件和一个二进制文件。例如,二进制文件名为 TLG00004.bin,在记事本中它看起来像这样(部分):
当我在 Visual Studio 2015(社区)中将该文件作为二进制文件打开时,十六进制如下所示:
这对我没有帮助。我什至不知道如何开始将其作为代码中的字节流(或其他任何内容)阅读。
我知道文件应该以人类可读的形式看起来像这样:(TimeStart, PositionNorth, PositionEast, PositionStatus, # DLV, DLV 0, PDV 0, DLV 1, PDV 1, DLV 2, PDV 2,...)最多可以有 255 个 DLV-PDV 对,我认为它们是 32 位整数。一个例子显示为:(2005-05-02T16:32:00,51.00678,6.03489,1,2,0,10,1,15)
我在文档中看到的一些小提示向我表明这必须是 utf-8 和 base64 编码,带有小端和无字节顺序标记。但是我尝试在 Hexinator 的免费版本中打开它,并且无法(人类)使用该应用程序中的数十种编码中的任何一种来读取它,包括 utf-8、16、32...
我知道这不是正常的编程内容,但我把它扔在那里,看看我是否足够幸运,之前有人做过这件事并看到了这一点。任何提示或资源指向都会让我感激不尽,如果有人可以分享任何读取此类文件的代码,我将非常感激。
我正在尝试使用 Falcon 框架(python)实现上传文件的 POST 请求。
我已经使用 falcon-multipart 来实现 multipart/form-data,这允许我在 cgi.FieldStorage() 中检索我的文件,其中文件是二进制格式,但是现在,我需要将此文件写入一个目录中原始扩展名。
这是我正在使用的代码。
应用程序.py:
import falcon
from .files import Resource
from falcon_multipart.middleware import MultipartMiddleware
api = application = falcon.API(middleware=[MultipartMiddleware()])
files = Resource()
api.add_route('/files', files)
Run Code Online (Sandbox Code Playgroud)
文件.py:
import io
import os
import shutil
import falcon
import json
class Resource(object):
_storage_path = './uploaded_files'
def on_post(self, req, resp):
"""
POST METHOD
"""
# Retrieve file extension
ext = req.get_param('extension')
# Retrieve input_file
input_file = req.get_param('file')
# Read file as binary
raw = input_file.file.read()
# Retrieve …Run Code Online (Sandbox Code Playgroud) 我有一个函数可以读取二进制文件,然后使用 struct.unpack() 解压缩文件的内容。我的功能工作得很好。如果/当我使用长“格式”字符串解压缩整个文件时,速度会更快。问题是有时字节对齐会发生变化,所以我的格式字符串(无效)看起来像 '<10sHHb>llh' (这只是一个例子(它们通常更长))。有没有处理这种情况的超灵巧/pythonic 方法?
python performance binaryfiles python-3.x iterable-unpacking
我正在学习可执行二进制文件的布局。我的最终目标是分析可以重构(在其源代码中)以减少编译输出大小的特定可执行文件。
我一直在使用https://www.embeddedrelated.com/showarticle/900.php和https://www.geeksforgeeks.org/memory-layout-of-c-program/作为这个初步学习的参考。
据我所知,链接器脚本指定了放置已编译二进制文件部分的地址。例如
> ld --verbose | grep text
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
Run Code Online (Sandbox Code Playgroud)
我认为这意味着text编译二进制文件的段从内存地址开始0x400000- 真的吗?
这个值0x400000代表什么?我可能没有正确理解某些东西,但肯定0x400000不代表物理内存位置,是吗?例如,如果我跑我的编译的两个实例a.out可并行执行,他们不可能都同时占据的空间0x400000,对不对?
binaryfiles ×10
c ×2
linker ×2
python-3.x ×2
ada ×1
apache-spark ×1
binutils ×1
c# ×1
elf ×1
encoding ×1
geospatial ×1
ld ×1
loader ×1
packing ×1
performance ×1
post ×1
python ×1
r ×1
record ×1
scala ×1
struct ×1