[英]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.