我有以下文件:
abcde
kwakwa
<0x1A>
line3
linllll
Run Code Online (Sandbox Code Playgroud)
其中,<0x1A>表示十六进制值为0x1A的字节.尝试在Python中读取此文件时:
for line in open('t.txt'):
print line,
Run Code Online (Sandbox Code Playgroud)
它只读取前两行,并退出循环.
解决方案似乎是以二进制(或通用换行模式)打开文件 - 'rb'或'rU'.你能解释一下这种行为吗?
我有一个二进制文件,我想直接嵌入到我的源代码中,因此它将直接编译到.exe文件中,而不是从文件中读取它,所以当我启动程序时数据已经在内存中.
我该怎么做呢?
我得到的唯一想法是将我的二进制数据编码为base64,将其放入字符串变量然后将其解码回原始二进制数据,但这是一种棘手的方法,会导致无意义的内存分配.此外,我想将.exe中的数据存储为原始数据的紧凑.
编辑:我之所以使用base64的原因是因为我想让源代码文件尽可能小.
是否有可用于Mac(Perl/Python/Cocoa/etc)或命令行工具的任何语言的API可用于加载二进制文件(app/bundle/framework/etc)并提取使用的硬编码字符串在代码中?
背后的原因是我们想要检查编译的二进制文件中是否有任何硬编码路径.
我在RAID 5(4 x 7.2k @ 3TB)系统上有一些2TB只读(没有写入一次)文件.
现在我有一些想要读取该文件部分的线程.每个线程都有一个所需的块数组.每个块都通过文件偏移(位置)和大小(大多数约300个字节)来寻址.
读取此数据的最快方法是什么.我不关心CPU周期,(磁盘)延迟是重要的.所以,如果可能的话,我想利用硬盘的NCQ.
由于文件是高度压缩的,将随机访问,我确切地知道位置,我没有其他方法来优化它.
读取数据的最佳方法是什么?你有经验,技巧和提示吗?
我正在尝试WebClient使用反应式编程的代码库中的Spring 5(5.0.0.RC2)中的新内容,并且我已成功将JSON响应从端点映射到我的应用程序中的DTO,这非常好用:
WebClient client = WebClient.create(baseURI);
Mono<DTO> dto = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(DTO.class));
Run Code Online (Sandbox Code Playgroud)
但是,现在我正在尝试使用协议缓冲区(二进制数据作为application/octet-stream)的端点的响应体,所以我想从响应中获取原始字节,然后我将自己映射到一个对象.
我Bytes从Google Guava 那里得到了这样的工作方式:
Mono<byte[]> bytes = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchange()
.flatMapMany(response -> response.body(BodyExtractors.toDataBuffers()))
.map(dataBuffer -> {
ByteBuffer byteBuffer = dataBuffer.asByteBuffer();
byte[] byteArray = new byte[byteBuffer.remaining()];
byteBuffer.get(byteArray, 0, bytes.length);
return byteArray;
})
.reduce(Bytes::concat)
Run Code Online (Sandbox Code Playgroud)
这有效,但是有更简单,更优雅的方式来获取这些字节吗?
java spring binary-data protocol-buffers reactive-programming
我到处寻找这个问题的答案,但是找不到任何东西,所以希望你们能在这里帮助我.
基本上我想将图像插入到我使用c#的xml文档中的元素中
我知道我必须把它变成字节,但我不确定如何做到这一点,然后将其插入正确的元素......
请帮忙,因为我是新手
如何从TLS客户端Hello消息中提取服务器名称指示.我很难理解这个关于TLS扩展的非常神秘的RFC 3546,其中定义了SNI.
到目前为止我已经理解的事情:
如果我能找到该长度字节的确切位置,那么提取SNI将非常简单.但是我如何首先到达那个字节?
所以,我试图写一个 gzip 文件,实际上是从网上写的,但为了简化我写了一些非常基本的测试。
import gzip
LINES = [b'I am a test line' for _ in range(100_000)]
f = gzip.open('./test.text.gz', 'wb')
for line in LINES:
f.write(line)
f.close()
Run Code Online (Sandbox Code Playgroud)
它运行良好,我可以在 Jupyter 中看到它在目录列表中创建了 test.txt.gz 文件。所以我点击它,期待一大堆垃圾字符指示一个二进制文件,就像你在记事本中看到的那样。
然而,相反,我得到了这个......
Error! test.text.gz is not UTF-8 encoded.
Saving disabled.
See console for more details
Run Code Online (Sandbox Code Playgroud)
这让我想,天哪,编码错误,我的编码有问题,我的保存,我可以保存字节吗?我是否使用了正确的例程?然后花 5 个小时尝试代码和模块的所有组合。
我正在为二进制格式编写解析器.这种二进制格式涉及不同的表,这些表再次是二进制格式,通常包含不同的字段大小(大约在50到100之间).
这些结构中的大多数将具有位域,并且在用C表示时将看起来像这些:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
Run Code Online (Sandbox Code Playgroud)
我遇到了struct模块,但意识到它的最低分辨率是一个字节而不是一点,否则该模块几乎适合这项工作.
我知道使用ctypes支持位域,但我不知道如何在这里连接包含位域的ctypes结构.
我的另一个选择是自己操作这些位并将其提供给字节并将其与struct模块一起使用 - 但由于我有接近50-100种不同类型的此类结构,因此编写代码变得更容易出错.我也担心效率,因为这个工具可能用于解析大千兆字节的二进制数据.
谢谢.
我正在尝试编写一个讨论二进制网络协议的小型Haskell程序,而且我遇到了一个令人惊讶的困难.
很明显二进制数据应该存储为ByteString.
问题:我应该hGet/ hPut单个多字节整数,还是更高效地构建ByteString整个事物并使用它?
看起来这个binary包应该在这里很有用.但是,binary只处理惰性 ByteString值.
问:是否hGet在偷懒 ByteString实际读取的字节严格的规定是多少?或者它是否尝试做某种懒惰的I/O?(我不想要懒惰的I/O!)
问题:为什么文档没有指定这个?
代码看起来会包含很多"获取下一个整数,将其与此值进行比较,如果没有则抛出错误,否则继续执行下一步..."我不确定如何干净地构造没有写意大利面条代码.
总之,我想要做的事情很简单,但我似乎正在努力寻找使代码看起来简单的方法.也许我只是过度思考这个并且遗漏了一些明显的东西......