为什么我在处理 JPG 文件时会出现内存错误?

Why do I get memory errors when mmap()'ing a JPG file?

本文关键字:内存 错误 处理 JPG 文件 为什么      更新时间:2023-10-16

我有以下代码部分:

char*
Sender::PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
    int fd, pagesize;
    char *data;
    ifstream file(filename, ios::binary | ios::ate);
    int size = file.tellg();
    cout << "File Size: " << size << endl;
    if(size < bytesToTransfer)
        {cout << "File smaller than specified number of bytes {" << bytesToTransfer << "} to transfer -- Exiting!n"; exit(1);}
    fd = open(filename, O_RDONLY);
    if (fd==NULL) {fputs ("File error",stderr); exit (1);}
    cout << "File Open: " << filename << endl;
    pagesize = getpagesize();
    cout << "Pagesize: " << pagesize << endl;
    data = static_cast<char*>(mmap((caddr_t)0, bytesToTransfer, PROT_READ, MAP_SHARED, fd, 0));
    if (*data == -1) {fputs ("Memory error",stderr); exit (2);}
    return data;
}

这似乎适用于文本和.deb文件——然而,当尝试使用大约3MB的图像文件(.jpg)时,我会遇到内存错误:

File Size: 3333840
File Open: t1.jpg
Pagesize: 4096
Memory error[Inferior 1 (process 3293) exited with code 02]

我用错mmap()了吗?我正在尝试编写一个简单的包装器,它将接受任何类型的文件,并返回一个包含指定字节数的char*。

您应该只检查data == -1(或者更好的是,检查MAP_FAILED),而不是检查*data == -1(此处通过*取消引用是错误的)。

代码失败的原因是每个JPEG文件的第一个字节是十六进制的FF或带符号十进制的-1。

有关JPEG的更多详细信息,请在谷歌上搜索"JPEG文件格式"。例如,在此页面上搜索"SOI"。