簡體   English   中英

通過mingw在Windows上的gzstream:注入CR + LF

[英]gzstream on windows via mingw: injects CR + LF

我從網站上下載了源代碼並進行了構建,但是當我運行測試時,所有壓縮文件都具有CR + LF行尾,而不僅僅是LF,這使得解壓縮后的文件與原始文件不同。

我正在查看源代碼,但似乎他們已經在以二進制模式打開文件了:

gzstreambuf* gzstreambuf::open( const char* name, int open_mode) {
    if ( is_open())
        return (gzstreambuf*)0;
    mode = open_mode;
    // no append nor read/write mode
    if ((mode & std::ios::ate) || (mode & std::ios::app)
        || ((mode & std::ios::in) && (mode & std::ios::out)))
        return (gzstreambuf*)0;
    char  fmode[10];
    char* fmodeptr = fmode;
    if ( mode & std::ios::in)
        *fmodeptr++ = 'r';
    else if ( mode & std::ios::out)
        *fmodeptr++ = 'w';
    *fmodeptr++ = 'b';
    *fmodeptr = '\0';
    file = gzopen( name, fmode);
    if (file == 0)
        return (gzstreambuf*)0;
    opened = 1;
    return this;
}

我真的很想使用這段代碼,因為它看起來很干凈並且可以在mingw gcc上輕松編譯。 唯一的問題是這個棘手的業務,如果我能找到解決方案的話,我可以放手。

我已經成功實施了解決方法。 盡管gzstream看起來不錯,但我還是硬着頭皮寫了一些直接使用zlib的代碼。 事實證明,這一點都還不錯因為zlib中隱藏了幫助程序,並且zlib.h本身也包含了許多有用的注釋。

ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); 很簡單。

當然,偽造的0x0D回車字符也不再有問題!

std :: ios :: binary在哪里?

在UNIX平台上,這通常是不必要的,因此某些人在不需要的時候會忽略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM