通过二进制字符串流调用 IMG_Load_RW() 时访问冲突?

Access violation when calling IMG_Load_RW() over a binary stringstream?

提问人:kyluck 提问时间:9/30/2023 最后编辑:genpfaultkyluck 更新时间:9/30/2023 访问量:40

问:

我通过逐字节读取它们,为每个字节添加值 3 并将处理的字节发送回文件流来创建一些加密的 jpg 图像。该程序还可以通过执行反向操作(减去数字 3)将它们解密到原始文件中,并且一切正常。

现在,我想将加密的 jpg 图像读取到二进制字符串流中,对其进行解密,然后直接从该 jpg 字符串流内存数据创建 SDL Surface。

这是我写的函数:

bool b_get_SDLSurface_from_stream(string str_path, SDL_Surface** sdls_image)
{
    ifstream ifstr_i;
    stringstream ss_image_data(stringstream::out | stringstream::binary);
    unsigned char  uint8_b;

    ifstr_i.open(str_path.c_str(), std::ios_base::binary);
    if (!ifstr_i.is_open())
    {
        return false;
    }

    while (ifstr_i >> noskipws >> uint8_b)
    {
        uint8_b = uint8_b - 3;                                                                
        ss_image_data << uint8_b;
    }

    if (ss_do.rdbuf()->in_avail() == 0)
    {
        return false;
    }

    int n_size = ss_image_data.str().size();
    SDL_RWops* p_sdlrwops_image = SDL_RWFromMem(&ss_image_data, n_size);

    if (p_sdlrwops_i == NULL)
    {
        return false;
    }

    *sdls_image = IMG_Load_RW(p_sdlrwops_image, 0);
    if (*sdls_image == NULL)
    {
        return false;
    }

    ifstr_i.close();
    return true;
}

...但是我收到一个错误,说在调用以下行的地方存在访问冲突:

*sdls_image = IMG_Load_RW(p_sdlrwops_image, 0);
C++ 访问冲突 字符串流 SDL 映像

评论

0赞 PaulMcKenzie 9/30/2023
SDL_Surface** sdls_image -- *sdls_image = IMG_Load_RW(p_sdlrwops_image, 0);-- 在您在这里使用它之前,我们不知道何时、何地或如何分配、使用等。sdls_image
1赞 genpfault 9/30/2023
为什么要创建一个 from 而不是里面的数据?SDL_RWopsss_image_datass_image_data().str()
0赞 user7860670 9/30/2023
&ss_image_data是指向字符串流对象的指针,而不是指向它所保存的数据的指针。将数据存储在而不是字符串流中会是一个更好的主意。vector<uint8_t>
0赞 kyluck 9/30/2023
@PaulMcKenzie SDL 图面是类的成员。图面的地址被传递给上述函数。如果我从文件加载表面,它可以正常工作。
0赞 kyluck 9/30/2023
@genpfault 谢谢,我现在尝试使用,然后和.然后我使用了 ,但它仍然给出相同的错误。string s = ss_image_data.str()const char* c = s.c_str()int n_size = s.size()SDL_RWops* p_sdlrwops_image = SDL_RWFromMem(&c, n_size)

答: 暂无答案