我正在尝试编写 HTTP POST 请求,但我需要首先将数据转换为二进制格式。这可能是一个简单的问题,但我发现 R 连接确实令人困惑,而且我一直很难找到一个好的资源来以我理解的方式解释它们。
举个例子,假设我想编码一个整数(8 字节),然后编码一个数字(4 字节)。这是我尝试过的代码:
myint <- as.integer(1339700942)
mydouble <- 1.2
obj <- file(open='w+b') #I've tried textConnection too, but no good
w.int <- writeBin(myint, obj, size=8, endian='big')
w.double <- writeBin(mydouble, obj, size=4, endian='big')
Run Code Online (Sandbox Code Playgroud)
这允许我打开连接,但它只写了NULL. writeBin在这种情况下使用连接的正确方法是什么?
我可以像这样读取二进制文件的第一个字节:
with open(my_binary_file,'rb') as f:
f.read(1)
Run Code Online (Sandbox Code Playgroud)
但是我该如何使用 fileinput 模块来做到这一点呢?如果我运行这段代码:
import fileinput
with fileinput.FileInput(my_binary_file,'rb') as f:
f.read(1)
Run Code Online (Sandbox Code Playgroud)
然后我得到这个错误:
AttributeError: 'FileInput' object has no attribute 'read'
Run Code Online (Sandbox Code Playgroud)
是否有类似于 fileinput 的模块,它允许我读取多个二进制文件的字节/字符而不是行?
编辑:读取二进制文件的一行并循环它不是一个选项,因为二进制文件很大并且不包含换行符。
我需要从二进制文件中提取数据。
我用过binaryRecords并得到了RDD[Array[Byte]]。
从这里我想将每条记录解析为
case class (Field1: Int, Filed2 : Short, Field3: Long)
我怎样才能做到这一点?
我读过它的getline行为就像一个未格式化的输入函数。我相信应该允许它在二进制文件上使用。举例来说,我已经这样做了:
ofstream ouput("foo.txt", ios_base::binary);
const auto foo = "lorem ipsum";
output.write(foo, strlen(foo) + 1);
output.close();
ifstream input("foo.txt", ios_base::binary);
string bar;
getline(input, bar, '\0');
Run Code Online (Sandbox Code Playgroud)
这是否违反任何规则?它似乎工作得很好,我想我传统上只是看到通过写入大小然后写入数组来处理数组。
现在我有一个包含浮点数据的二进制文件,每个数据是4个字节,我想将其读入一个2D数组,当我使用
B1 = np.fromfile('/home/lijiao/Documents/transform/Data/AHI8_OBI_1000M_NOM_20160812_0040.hdf_B1.dat', dtype=float)
Run Code Online (Sandbox Code Playgroud)
它会给我一个长度为60500000的一维数组,那么如何以每4个字节读取数据呢?
编辑:这是我的解决方案:
filename = '/home/lijiao/Documents/transform/Data/AHI8_OBI_1000M_NOM_20160812_0040.hdf_B1.dat'
with open(filename, 'rb') as f:
data = np.fromfile(f, dtype=np.float32)
array = np.reshape(data, [11000, 11000])
Run Code Online (Sandbox Code Playgroud) 我想用Java有效地读取一个巨大的二进制文件(~100GB)。我必须处理它的每一行。行处理将在单独的线程中进行。我不想将整个文件加载到内存中。分块阅读有用吗?最佳缓冲区大小是多少?有什么公式吗?
我有一个来自 github 的脚本https://github.com/akatrevorjay/edid-generator
它是用汇编编写的,现在我想用这个 Edid Stuff 做更多的操作,因为我从来没有做过汇编,所以我用 Python 编写它。为此我需要知道有多少字节
.ascii.fill 7,2,0x0101 .long.data通常必须用Python“转换”它。
如果有帮助,这里是每个的完整代码行:
start1: .ascii "Linux #0"
.fill 7,2,0x0101 /* Unused */
serial_number: .long SERIAL
.data (Dont have more here)
Run Code Online (Sandbox Code Playgroud) 我正在处理一个在开始时不是字节对齐的二进制文件。不久在文件中有一个 24 位模式 0xfaf330,它是一个同步标记,用于标记后续字节对齐数据。我在文件上使用 Python mmap 并希望在找到标记来处理文件的其余部分后使用 Python memoryview。那么,我如何找到 24 位模式,然后从那时起使用 mmap 和 memoryview?
我有一个函数可以读取二进制文件,然后使用 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
python ×3
python-3.x ×3
file-io ×2
apache-spark ×1
arrays ×1
assembly ×1
binutils ×1
c++ ×1
getline ×1
io ×1
java ×1
ld ×1
linker ×1
numpy ×1
performance ×1
r ×1
scala ×1
string ×1