【问题标题】:Loading text file from zip archive with minizip/zlib, garbage characters at end of file使用 minizip/zlib 从 zip 存档加载文本文件,文件末尾有垃圾字符
【发布时间】:2014-05-05 21:59:15
【问题描述】:

我正在尝试从 zip 文件中加载着色器源,该文件是使用记事本创建的纯文本文件。加载代码如下(从下面的sn-p中去掉错误检查代码):

std::string retrievestringfromarchive(std::string filename)
{
//data is the zip resource attached elsewhere
unz_file_info info;
Uint8* rwh;

unzLocateFile(data, filename.c_str(), NULL);
unzOpenCurrentFile(data);
unzGetCurrentFileInfo(data, &info, NULL, 0, NULL, 0, NULL, 0)
rwh = (Uint8*)malloc(info.uncompressed_size);
unzReadCurrentFile( data, rwh, info.uncompressed_size );

//garbage at end of file
const char* rwh1 = reinterpret_cast<char*>(rwh);
std::stringstream tempstream(rwh1);
std::string tempstring = tempstream.str();
free(rwh);
return tempstring;
}

返回的字符串的输出如下:

//FRAGMENT SHADER    
#version 120    

//in from vertex shader    
varying vec2 f_texcoord;    
varying vec4 f_color;

uniform sampler2D mytexture;

void main(void)
{
    gl_FragColor = texture2D(mytexture, f_texcoord) * f_color;
}
//endfile««««««««îþîþ

注意事项:

  • 我检查了 info 结构,压缩和未压缩的大小都与 7zip 中的信息匹配

  • 当使用 gdb 检查时,缓冲区“rwh”本身在末尾有垃圾字符

  • 我在Win7 64bit,使用codeblocks和TDM-GCC-32 4.8.1编译

  • “//endfile”注释巧妙地避免了 gl 着色器编译问题,但必须这样做。

【问题讨论】:

    标签: c++ c zip zlib zipfile


    【解决方案1】:
    rwh = (Uint8*)malloc(info.uncompressed_size);
    unzReadCurrentFile( data, rwh, info.uncompressed_size );
    

    我非常怀疑 unzReadCurrentFile 是否在缓冲区中添加了 0 终止符 - 无论如何都没有空间 - 并且您将指针用作 0 终止的字符串。

    如果将缓冲区解释为字符串确实有意义,您可以这样做:

    std::string tempstring(rwh1, info.uncompressed_size);
    

    【讨论】:

    • 谢谢,成功了。我也拿出了串流。我看过一个在两者之间使用字符串流的示例,但显然没有必要。
    【解决方案2】:

    解压器给你一个解压后的数据块——但它不知道数据是纯文本并且你打算将它用作 C 语言字符串。因此它不会在末尾附加终止 NUL(零)字符。就这样。只需复制给定数量的字符,不要假设数据块是零终止的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多