我偶然发现了相当古老的照片对象磁盘,遗憾地发现公司(hemera)不再提供支持了.这给我留下了一大堆.hpi文件.幸运的是,我发现这个信息对提取的文件JPG和PNG组件.
不幸的是,我无法让它发挥作用.谁能弄清楚这段代码有什么问题?如果Perl不是您的话,我会对PHP或Python解决方案感到满意.:)
open(I, "$name") || die;
binmode(I);
$_ = <I>;
close(I);
my ($j, $p) = m|^.{32}(.*)(\211PNG.*)$|s;
open(J, ">$name.jpg") &&
do { binmode(J); print J $j; close J; };
open(P, ">$name.png") &&
do { binmode(P); print P $p; close P; };
Run Code Online (Sandbox Code Playgroud)
如果它有帮助的话,我从CD中取出的当前测试文件的hexdump就在这里:
0000000 89 48 50 49 0d 0a 1a 0a 64 00 00 00 20 00 00 00
0000010 45 89 00 00 65 89 00 00 0a 21 00 00 00 d0 d0 00
Run Code Online (Sandbox Code Playgroud) 使用此代码,我尝试以二进制格式打印字符串"foo"10次.但为什么这个功能没有起作用呢?
#include <iostream>
#include <fstream>
using namespace std;
template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
for (unsigned i = 0; i < St.size(); i++) {
char CStr = St[i];
fn.write(&CStr.front(), CStr.size());
}
return;
}
int main() {
string MyStr = "Foo";
ofstream myfile;
myfile.open("OuputFile.txt", ios::binary|ios::out);
// We want to print it 10 times horizontally
// separated with tab
for (int i = 0; i < 9; i++) {
WriteStr2BinFh(Mystr+"\t", myfile);
}
myfile.close();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C创建一个新的位图文件.这是.bmp文件头的结构.
#define uint16 unsigned short
#define uint32 unsigned long
#define uint8 unsigned char
typedef struct
{
uint16 magic; //specifies the file type "BM" 0x424d
uint32 bfSize; //specifies the size in bytes of the bitmap file
uint16 bfReserved1; //reserved; must be 0
uint16 bfReserved2; //reserved; must be 0
uint32 bOffBits;
} BITMAPFILEHEADER;
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我这样做.
main() {
FILE* fp;
fp = fopen("test.bmp", "wb");
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
bmfh.magic = 0x4d42; // "BM" magic word
bmfh.bfSize = 70;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0; …Run Code Online (Sandbox Code Playgroud) 我想为占用太多RAM的程序执行磁盘I/O操作.我使用双精度矩阵并考虑将它们写入磁盘,因为字节是最快的方式(我需要保持双精度).
如何做到便携?
我发现这个代码(这里),但作者说它不便携......
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ofstream ofs( "atest.txt", ios::binary );
if ( ofs ) {
double pi = 3.14;
ofs.write( reinterpret_cast<char*>( &pi ), sizeof pi );
// Close the file to unlock it
ofs.close();
// Use a new object so we don't have to worry
// about error states in the old object
ifstream ifs( "atest.txt", ios::binary );
double read;
if ( ifs ) {
ifs.read( reinterpret_cast<char*>( &read ), sizeof …Run Code Online (Sandbox Code Playgroud) 我正在编写一段代码来读取使用C++ IOStreams跨越多个文件的几GB数据,我已经选择了C API,出于一些我不会厌烦你的设计原因.由于数据是由我的代码运行的同一台机器上的单独程序生成的,因此我相信,大多数情况下,可以忽略与endianess相关的问题.
这些文件具有相当复杂的结构.例如,有一个标题描述了特定二进制配置的记录数.稍后在文件中,我必须使代码有条件地读取该行数.这种模式以复杂但记录良好的方式重复出现.
我的问题与如何有效地做到这一点有关 - 我确信我的过程将受IO限制,所以我的直觉是不是在小块中读取数据,例如以下方法
std::vector<int> buffer;
buffer.reserve(500);
file.read( (char*)&buffer[0], 500 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
我应该一次完全读取一个文件并尝试在内存中处理它.所以我相互关联的问题:
我知道显而易见的答案是尝试然后稍后进行分析,然后我肯定会这样做.但是这个问题更多的是关于如何在开始时选择正确的方法 - 一种"选择正确的算法"优化,而不是在稍后识别瓶颈后我可以设想的那种优化!
我会对提供的答案感兴趣 - 我倾向于只能找到相对简单的二进制文件的答案,上面的方法是合适的.我的问题是大部分二进制数据是有条件地结构化文件头中的数字(即使标题是这样格式化的!)所以我需要能够更仔细地处理文件.
提前致谢.
编辑: 关于内存映射的一些评论 - 看起来不错,但不知道怎么做,我读过的所有内容都告诉我它不可移植.我有兴趣尝试mmap,但也有更便携的解决方案(如果有的话!)
我知道有很多类型的编码和解码,根据我的阅读,base64是编码二进制文件(图像,mp3,视频)的绝佳选择.
现在,当涉及到解码时,我将需要从base64转换然后获取字符串值.解码后获取字符串的过程,我需要这样做(在c#中):System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);
在这里我注意到我有几个选项来使用什么来获取字符串,如ASCII,UNICODE,DEFAULT.
这篇文章中的真正问题是如果我使用java编码和c#解码二进制文件,我应该使用什么是最好的解决方案/选择?我尝试了几种方法,有些字符无法读取,因此给出了问号符号(?).
然而,可以读取字节的最接近的编码解码就是当我在Java中使用它时:String encoded = Base64.encodeToString(fileData, Base64.CRLF);同时在c#im中使用如下:byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
string returnValue = System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);
不过,有几个字符无法读取.有没有人有这个问题陈述的解决方案?任何反馈都非常感谢.谢谢你的进步.
我正在修补JavaScript中的一些Windows应用程序开发,我似乎陷入了如何从二进制文件中获取字节数组的问题.我在网上找到了几个例子,但它们似乎只是用文本阅读而我的文件是图像.我正在打开这样的文件:
Windows.Storage.FileIO.readBufferAsync(photos[currentIndex]).done(function (buffer) {
var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
var fileContent = dataReader.readString(buffer.length);
dataReader.close();
// do something with fileContent
});
Run Code Online (Sandbox Code Playgroud)
photos[currentIndex]文件在哪里(从中加载getFilesAsync()).当然,这种情况下的错误是readString二进制数据失败.它无法将"字符"映射到字符串中.我也试过这个:
Windows.Storage.FileIO.readBufferAsync(photos[currentIndex]).done(function (buffer) {
var bytes = [];
var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
dataReader.readBytes(bytes);
dataReader.close();
// do something with bytes
});
Run Code Online (Sandbox Code Playgroud)
但是bytes是空的,所以我认为我错误地使用了这个.我想我只是在这里忽略了一些简单的东西,但由于某种原因,我似乎无法找到将二进制文件读入字节数组的正确方法.有人可以提供第二眼帮助吗?
基本上,我需要使用C++编写十六进制转储实用程序.它看起来像这样

(使用Visual Studio的Word文档的十六进制转储的一部分)
我想提示用户输入文件名,然后显示十六进制值以及翻译的ASCII字符.我仍然是处理二进制文件的新手,所以如果你能保持简单,那将非常感激.
在Linux上,有没有办法告诉我是否已经从命令行打开/关闭堆栈粉碎编译二进制文件?
我很确定我有保护,但仅仅为了理智,我想为我的二进制文件编写一些测试,以防万一有一天出现问题且保护已关闭...某些原因.
我有一个很大的二进制文件file1.bin,我想创建一个文件file2.bin,该文件仅包含file1.bin的前32kb。
所以我正在读取file1,如下所示:
myArr = bytearray()
with open(r"C:\Users\User\file1.bin", "rb") as f:
byte = f.read(1)
for i in range(32,678):
myArr.extend(byte)
byte = f.read(1)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何从此处继续从myArr创建file2二进制文件?
我试过了
with open(r"C:\Users\User\file2.bin", "w") as f:
f.write(myArr)
Run Code Online (Sandbox Code Playgroud)
但这导致:
f.write(myArr)
TypeError: must be string or pinned buffer, not bytearray
Run Code Online (Sandbox Code Playgroud) binaryfiles ×10
c++ ×4
c ×2
binary ×1
bitmap ×1
c# ×1
command-line ×1
decode ×1
dump ×1
file-io ×1
hex ×1
io ×1
java ×1
linux ×1
performance ×1
portability ×1
python ×1
unix ×1
utility ×1
winjs ×1