请告诉我最佳/快速的方法:
1)将非常小的二进制文件加载到内存中.例如图标;
2)加载/读取大小为512Mb +的非常大的二进制文件.也许我必须使用内存映射IO?
3)当你不想考虑大小/速度但是必须做的事情时你的共同选择:将所有字节读入内存?
谢谢!!!
PS对不起,也许是微不足道的问题.请不要关闭它;)
PS2.C#的模拟问题镜像 ;
我想知道二进制格式和ASCII格式之间的区别.问题是我需要使用PETSc进行一些矩阵操作,我的所有矩阵都存储在文本文件中.
PETSc有不同的规则来处理这些格式.我不知道这些格式是什么,更不用说我的文本文件是什么格式了.
有没有办法将一种格式转换为另一种格式?
这是一个基本问题; 详细的答案将真正帮助我理解这一点.
我将我的数据保存在我的数据库中作为Longblob并保存我正在将其转换为字节并保存现在,同时检索我们可以通过写如下数据
Byte[] bytes = (Byte[])dt.Rows[0]["Data"];
Response.BinaryWrite(bytes);
Run Code Online (Sandbox Code Playgroud)
但我需要的是我需要以字节为单位的数据表示为字符串是否可能
#include<fstream.h>
#include<conio.h>
#include<alloc.h>
class profile
{
public: char *copyBytes;
}p;
void main()
{
unsigned int size;
fstream file ("file.mp3", ios::binary | ios::in | ios::out);
fstream copy ("copy.mp3", ios::binary | ios::in | ios::out);
file.seekg(0, ios::end);
size=file.tellg();
file.seekg(0);
while(!file.eof())
{
p.copyBytes=(char*)malloc(size);
file.read((char*)p.copyBytes, size);
copy.write((char*)p.copyBytes, size);
free(p.copyBytes);
}
file.close();
}
Run Code Online (Sandbox Code Playgroud)
该程序制作二进制文件file.mp3的副本.原始二进制文件(file.mp3)为2.13 MB,复制的文件(copy.mp3)为2.14 MB.为什么?
我在C中定义了这样的二进制文件
FILE *gfp;
gfp = fopen(gridfiles, "wb");
Run Code Online (Sandbox Code Playgroud)
变量gridfiles存储文件的名称,并且已在前面定义过.现在我在文件中写出两个变量.
for(yy = 0; yy < nfiley; yy++) {
for(xx = 0; xx < nfilex; xx++) {
filebx = beguv + xx*1E3;
fileby = enduv - yy*1E3;
fwrite(&filebx, sizeof(filebx), 1, gfp);
fwrite(&fileby, sizeof(fileby), 1, gfp);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在这个代码后面我
fseek(gfp, 0, SEEK_SET);
fread(&filebx, sizeof(filebx), 1, gfp);
fread(&fileby, sizeof(fileby), 1, gfp);
fprintf(stderr, "%f %f", filebx, fileby);
Run Code Online (Sandbox Code Playgroud)
我的输出是
1000 15000
Run Code Online (Sandbox Code Playgroud)
对于前两个,这是预期的.
但如果经过一些其他的代码(根本不涉及这些文件)我重复fseek()等,我的输出是
14000 14000
Run Code Online (Sandbox Code Playgroud)
不管我做什么.我一直试图弄清楚这一段时间......任何人都知道我做错了什么?
我正在用C语言写一个二进制文件的结构.char*项和uint8项写得很好,但我似乎在编写uint32项时遇到问题.
我的写作代码在这里.
void writeOut(record *data){
FILE *fp = fopen("output.bin","w");
int i =0;
while(data[i].Name != NULL){
fwrite(data[i].Name, NAME_LEN ,1,fp);
fwrite(&data[i].Value1, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Value2, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Id, sizeof(uint32_t) ,1,fp);
fwrite(data[i].Text, TEXT_LEN ,1,fp);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
我的二进制文件对于记录1(十六进制)看起来像这样(用'|'用于显示字段结尾指向):
52 6F 64 27 72 6F 64 00 00 00 00 00 00 00 00 00 00 | 01 | 04 | 72 92 01 00 | 50 72 6F 6A 65 63 74 20 50 65 61 63 65 00 00 00 00 00 00 …
我声明并分配一些字节数组.我想用read(字节数组,偏移量,字节长度)方法初始化这些数组.第一个读取方法语句似乎正确地将前32个字节读入数组.但是,第二个读取方法不会抛出indexOutOfBounds异常.
偏移值的规范:
offset 0, length 32 bytes - contains some text
offset 32, length 2 bytes - contains something else
etc
Run Code Online (Sandbox Code Playgroud)
这是代码:
File file = new File("somebinaryfile.dat");
DataInputStream in = new DataInputStream(new FileInputStream(file));
byte[] array1 = new byte[32]; // first array
byte[] array2 = new byte[2]; // second array
in.read(array1, 0, 32);
in.read(array2, 32, 2);
in.close();
Run Code Online (Sandbox Code Playgroud)
我正在假设(可能不正确)在每个新的.read()方法语句中读取位置将自动增加.然而,如果我将34个元素分配给array2而不是仅仅2个元素,则不会抛出任何异常.因此,看起来前34个字节被读入array2而不是最后2个字节,即使我指定了偏移和字节长度......
我意识到RandomAccessFile类有一个漂亮的.seek(n)方法.但是,我很顽固,并希望坚持使用DataInputStream.
关于正确使用的任何建议,以便使用指定的偏移量和字节长度获得的数据初始化两个数组?
我有一个使用LZW算法创建压缩文件并使用哈希表的程序.我的压缩文件当前包含与哈希表索引相对应的整数.此压缩文件中的最大整数约为46000,可以很容易地用16位表示.现在,当我使用以下代码将此"compressedfile.txt"转换为二进制文件"binary.bin"(以进一步减小文件大小)时,我在"binary.bin"文件中获得32位整数.例如,如果我的压缩文件中有一个数字84,它将在我的二进制文件中转换为5400 0000.
std::ifstream in("compressedfile.txt");
std::ofstream out("binary.bin", ios::out | std::ios::binary);
int d;
while(in >> d)
{out.write((char*)&d, 4);}
Run Code Online (Sandbox Code Playgroud)
我的问题是我不能丢弃'5400 0000'中的结尾'0000',它在我的文件中占用了额外的2个字节.这是每个整数的情况,因为我的最大整数是46000,只能使用2个字节来表示.是否有任何代码可以设置我的二进制文件的基础?我希望我的问题很明确.
我有以下代码:
std::istream is;
// ... stream initialization ...
while(is)
{
uint32_t next4Bytes = 0;
is.read(reinterpret_cast<char*>(&next4Bytes), 4);
if(next4Bytes == 218893066)
{
is.seekg(-4, std::ios_base::cur);
break;
}
else
is.seekg(-3, std::ios_base::cur);
}
Run Code Online (Sandbox Code Playgroud)
有没有比reinterpret_cast<char*>从4个字节读std::istream入更好的方法uint32_t?(显然不是c式演员)
我正在为客户端开发本地解决方案,而无需在计算机上进行任何控制和互联网连接。
该解决方案将根据已购买许可证的允许请求(REST API调用)数量获利。因此,当前我们将请求计数存储在文件系统本身的加密文件中。但是此解决方案并不完美,因为可以将文件复制到某个位置,然后在请求配额结束后将其替换。同样,如果文件被删除,则需要支持人员的手动干预。
我正在寻找一种以二进制形式存储状态/数据并更新运行时的解决方案(考虑使用二进制本身更新的使用计数)
寻找更好的方法。
同样二进制应该从先前的存储状态开始
有办法吗?
PS:我知道写二进制文件不会解决问题,但是我认为,通过增加状态存储位置的排列和组合的数量,这将增加难度,并且由于不常见的知识是可以更改可执行文件,如果有人试图弄乱系统,它将是查找状态的最后一个位置(安全性由默默无闻)
binaryfiles ×10
c++ ×3
c ×2
java ×2
ascii ×1
asp.net ×1
binarywriter ×1
c# ×1
file-format ×1
file-io ×1
file-pointer ×1
go ×1
io ×1
istream ×1
java-io ×1
lzw ×1
petsc ×1
pointers ×1
readfile ×1
uint ×1