Compare commits

...

38 Commits

Author SHA1 Message Date
Adam Hathcock
1fc14e1075 Update to 0.11.4 2016-02-07 10:17:45 +00:00
Adam Hathcock
b3a5204e74 Bug fix for previous PR 2016-02-07 10:14:07 +00:00
Adam Hathcock
0fab1ff976 Merge pull request #125 from kenkendk/set_compression_info_on_stream
Fix setting compressioninfo on Zip streams
2016-02-04 10:00:20 +00:00
Kenneth Skovhede
a05b692fc3 More whitespace fix 2016-02-04 10:39:58 +01:00
Kenneth Skovhede
ed7f140364 Whitespace fix 2016-02-04 10:39:02 +01:00
Kenneth Skovhede
a4b594121e Added code to forward the compression info to the stream, such that it is possible to override the compression level and method on a per-stream basis. 2016-02-04 10:35:36 +01:00
Adam Hathcock
fe8da55c95 Merge pull request #122 from benshoof/net35_compat
Added support for .NET 3.5
2016-01-26 21:00:20 +00:00
benshoof
42c4eab4be Fix conflicts 2016-01-26 09:56:54 -09:00
Adam Hathcock
2e8844c896 This doesn't work :) 2016-01-26 11:57:40 +00:00
Adam Hathcock
aed7ff003d Merge pull request #121 from benshoof/rar_detection_fix
Fix false positives in Rar file detection
2016-01-26 11:54:07 +00:00
Adam Hathcock
681b28f654 Merge pull request #119 from benshoof/endian-neutral
SharpCompress now endian neutral
2016-01-26 11:51:30 +00:00
Adam Hathcock
0de64b1551 Use ExtractAllEntries if archives are SOLID types 2016-01-26 11:49:57 +00:00
Adam Hathcock
526df2404e Merge pull request #123 from kenkendk/remove_warnings
Fix various warnings
2016-01-26 09:21:03 +00:00
Kenneth Skovhede
f20274aac7 Removed debug comments 2016-01-26 10:18:23 +01:00
Kenneth Skovhede
08b899fdac Deleted unused variables 2016-01-26 10:18:13 +01:00
Kenneth Skovhede
7b91b6e7c8 Commented out various unused fields that cause warnings and makes the WarningsAsErrors directive abort the build 2016-01-26 09:48:00 +01:00
benshoof
1661b7ec36 Added support for .NET 3.5
SharpCompress can now be compiled for .NET 3.5 by defining symbol NET35
2016-01-25 09:02:19 -09:00
benshoof
e5ab9dc883 Fix false positives in Rar file detection 2016-01-25 08:03:40 -09:00
Adam Hathcock
25d22e33a7 Merge pull request #118 from kenkendk/master
Bugfix for inflate algorithm cutting of the end of certain blocks
2016-01-23 10:24:50 +00:00
benshoof
8ceac9000c SharpCompress now endian neutral
SharpCompress can now be used on machines with big endian architecture
such as powerpc. All byte conversions now run through Mono's
DataConverter (or a portable version for builds that don't allow unsafe
code) instead of BitConverter, as BitConverter's behavior depends on the
host cpu.
2016-01-22 14:32:35 -09:00
Kenneth Skovhede
ecceec8e1a Tabs -> spaces fix 2016-01-22 15:06:55 +01:00
Kenneth Skovhede
d5c88ebab3 Bugfix for inflate algorithm cutting of the end of certain blocks 2016-01-22 14:51:05 +01:00
Adam Hathcock
0a2adbc205 Merge pull request #115 from maxpiva/master
Adds Non Lineal "Solid Rar" Extraction to RarArchive.
2016-01-17 13:54:24 +00:00
mpiva
3be7f9da37 Adds Non Lineal "Solid Rar" Extraction to RarArchive. 2016-01-17 02:31:55 -03:00
Adam Hathcock
3f2ca67416 Forgot the file overload 2016-01-15 10:04:28 +00:00
Adam Hathcock
21087323af Make Tar last in detection as it contains other files 2016-01-09 13:29:29 +00:00
Adam Hathcock
05f92018c3 Merge pull request #113 from zentron/master
Preserve File Timestamps with IReader
2016-01-04 12:04:05 +00:00
Rob
b8fc4a2415 Preserve File Timestamps with IReader 2016-01-04 16:26:43 +10:00
Adam Hathcock
a30872809d Merge pull request #99 from Rovak/rarreader-add-password
Add password when opening RarReader
2016-01-03 03:18:12 -08:00
Adam Hathcock
7abf2ed58b Update README 2016-01-03 11:15:36 +00:00
Adam Hathcock
bec2662d23 Update version 2015-12-28 18:40:35 +00:00
Adam Hathcock
dd35052de9 Merge pull request #105 from benshoof/fix-tests-release-build
Fix Release build of Tests
2015-12-17 08:54:31 +00:00
Adam Hathcock
2a630e04b2 Merge pull request #107 from benshoof/fix-nonzip-perf-regression
Fixed serious performance regression (revert 0f12a073af)
2015-12-15 16:33:06 +00:00
benshoof
231b78e096 Revert 0f12a073af
Revert commit that caused all non-zip files to be read entirely upon
opening.
IsZipArchive() would read and process the entire file looking for a zip
header.
2015-12-15 07:28:50 -09:00
Adam Hathcock
ce6e1d26f4 Merge pull request #104 from benshoof/fix-vs2013-build
Fix VS2013 compiler warnings (errors)
2015-12-15 09:10:49 +00:00
benshoof
69a25cd142 Fix Release build of Tests
Fixes release builds of SharpCompress.Test and
SharpCompress.Test.Portable. The UNSIGNED symbol was missing from the
Release configurations of SharpCompress.Unsigned and
SharpCompress.PortableTest
2015-12-14 15:32:49 -09:00
benshoof
cc2ad7d8d5 Fix VS2013 compiler warnings (errors)
Fixes broken build in VS2013 introduced by
18bd810228. That commit attempted to fix a
compiler warning from VS2015, but this turns out to be a compiler bug:
https://github.com/dotnet/roslyn/issues/4027 . That commit added code
which VS2013 correctly treats as a compiler warning, breaking the VS2013
build.
I have reverted this unnecessary change to the deflate code, fixing the
VS2013 build, and disabled warning CS0675 on send_bits() which will
satisfy VS2015.
2015-12-14 15:24:33 -09:00
Roy van Kaathoven
6e0f4ecbc9 Add password when opening RarReader 2015-10-27 18:52:06 +01:00
59 changed files with 2397 additions and 500 deletions

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>sharpcompress</id>
<version>0.11.2</version>
<version>0.11.4</version>
<title>SharpCompress - Pure C# Decompression/Compression</title>
<authors>Adam Hathcock</authors>
<owners>Adam Hathcock</owners>

View File

@@ -1,8 +1,6 @@
SharpCompress
=============
Github mirror of http://sharpcompress.codeplex.com
SharpCompress is a compression library for .NET/Mono/Silverlight/WP7 that can unrar, un7zip, unzip, untar unbzip2 and ungzip with forward-only reading and file random access APIs. Write support for zip/tar/bzip2/gzip are implemented.
The major feature is support for non-seekable streams so large files can be processed on the fly (i.e. download stream).
@@ -11,6 +9,8 @@ A Simple Request
Hi everyone. I hope you're using SharpCompress and finding it useful. Please give me feedback on what you'd like to see changed especially as far as usability goes. New feature suggestions are always welcome as well. I would also like to know what projects SharpCompress is being used in. I like seeing how it is used to give me ideas for future versions. Thanks!
Please do not email me directly to ask for help. If you think there is a real issue, please report it here.
Want to contribute?
I'm always looking for help or ideas. Please submit code or email with ideas. Unfortunately, just letting me know you'd like to help is not enough because I really have no overall plan of what needs to be done. I'll definitely accept code submissions and add you as a member of the project!
@@ -21,6 +21,18 @@ TODOs (always lots):
* Zip64
* Multi-volume Zip support.
In-Progress:
==============
- RAR5 support
- DNX/NET Core support
- xproj targeting
Version 0.11.4:
==============
- SharpCompress is now endian neutral (matters for Mono platforms)
- Fix for Inflate (need to change implementation)
- Fixes for RAR detection
Version 0.11.1:
==============
- Added Cancel on IReader

View File

@@ -145,5 +145,16 @@ namespace SharpCompress.Test
}
CompareArchivesByPath(modified, scratchPath);
}
[TestMethod]
public void Tar_Containing_Rar_Archive()
{
string archiveFullPath = Path.Combine(TEST_ARCHIVES_PATH, "Tar.ContainsRar.tar");
using (Stream stream = File.OpenRead(archiveFullPath))
using (IArchive archive = ArchiveFactory.Open(stream))
{
Assert.IsTrue(archive.Type == ArchiveType.Tar);
}
}
}
}

View File

@@ -2,6 +2,7 @@
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SharpCompress.Common;
using SharpCompress.Reader;
using SharpCompress.Reader.Tar;
namespace SharpCompress.Test
@@ -88,5 +89,16 @@ namespace SharpCompress.Test
Assert.AreEqual(names.Count, 3);
}
}
[TestMethod]
public void Tar_Containing_Rar_Reader()
{
string archiveFullPath = Path.Combine(TEST_ARCHIVES_PATH, "Tar.ContainsRar.tar");
using (Stream stream = File.OpenRead(archiveFullPath))
using (IReader reader = ReaderFactory.Open(stream))
{
Assert.IsTrue(reader.ArchiveType == ArchiveType.Tar);
}
}
}
}

View File

@@ -31,12 +31,6 @@ namespace SharpCompress.Archive
return ZipArchive.Open(stream, options, null);
}
stream.Seek(0, SeekOrigin.Begin);
if (TarArchive.IsTarFile(stream))
{
stream.Seek(0, SeekOrigin.Begin);
return TarArchive.Open(stream, options);
}
stream.Seek(0, SeekOrigin.Begin);
if (SevenZipArchive.IsSevenZipFile(stream))
{
stream.Seek(0, SeekOrigin.Begin);
@@ -49,11 +43,17 @@ namespace SharpCompress.Archive
return GZipArchive.Open(stream, options);
}
stream.Seek(0, SeekOrigin.Begin);
if(RarArchive.IsRarFile(stream, Options.LookForHeader | Options.KeepStreamsOpen))
if (RarArchive.IsRarFile(stream, options))
{
stream.Seek(0, SeekOrigin.Begin);
return RarArchive.Open(stream, options);
}
stream.Seek(0, SeekOrigin.Begin);
if (TarArchive.IsTarFile(stream))
{
stream.Seek(0, SeekOrigin.Begin);
return TarArchive.Open(stream, options);
}
throw new InvalidOperationException("Cannot determine compressed stream type. Supported Archive Formats: Zip, GZip, Tar, Rar, 7Zip");
}
@@ -126,12 +126,6 @@ namespace SharpCompress.Archive
return ZipArchive.Open(fileInfo, options, null);
}
stream.Seek(0, SeekOrigin.Begin);
if (TarArchive.IsTarFile(stream))
{
stream.Dispose();
return TarArchive.Open(fileInfo, options);
}
stream.Seek(0, SeekOrigin.Begin);
if (SevenZipArchive.IsSevenZipFile(stream))
{
stream.Dispose();
@@ -144,11 +138,17 @@ namespace SharpCompress.Archive
return GZipArchive.Open(fileInfo, options);
}
stream.Seek(0, SeekOrigin.Begin);
if(RarArchive.IsRarFile(stream, Options.LookForHeader | Options.KeepStreamsOpen))
if (RarArchive.IsRarFile(stream, options))
{
stream.Dispose();
return RarArchive.Open(fileInfo, options);
}
stream.Seek(0, SeekOrigin.Begin);
if (TarArchive.IsTarFile(stream))
{
stream.Dispose();
return TarArchive.Open(fileInfo, options);
}
throw new InvalidOperationException("Cannot determine compressed stream type. Supported Archive Formats: Zip, GZip, Tar, Rar, 7Zip");
}
}

View File

@@ -27,7 +27,7 @@ namespace SharpCompress.Archive
{
return;
}
using(entryStream)
using (entryStream)
using (Stream s = new ListeningStream(streamListener, entryStream))
{
s.TransferTo(streamToWriteTo);
@@ -60,7 +60,10 @@ namespace SharpCompress.Archive
{
destinationFileName = Path.Combine(destinationDirectory, file);
}
entry.WriteToFile(destinationFileName, options);
if (!entry.IsDirectory)
{
entry.WriteToFile(destinationFileName, options);
}
}
/// <summary>
@@ -69,10 +72,6 @@ namespace SharpCompress.Archive
public static void WriteToFile(this IArchiveEntry entry, string destinationFileName,
ExtractOptions options = ExtractOptions.Overwrite)
{
if (entry.IsDirectory)
{
return;
}
FileMode fm = FileMode.Create;
if (!options.HasFlag(ExtractOptions.Overwrite))
@@ -84,39 +83,7 @@ namespace SharpCompress.Archive
entry.WriteTo(fs);
}
if (options.HasFlag(ExtractOptions.PreserveFileTime) || options.HasFlag(ExtractOptions.PreserveAttributes))
{
// update file time to original packed time
FileInfo nf = new FileInfo(destinationFileName);
if (nf.Exists)
{
if (options.HasFlag(ExtractOptions.PreserveFileTime))
{
if (entry.CreatedTime.HasValue)
{
nf.CreationTime = entry.CreatedTime.Value;
}
if (entry.LastModifiedTime.HasValue)
{
nf.LastWriteTime = entry.LastModifiedTime.Value;
}
if (entry.LastAccessedTime.HasValue)
{
nf.LastAccessTime = entry.CreatedTime.Value;
}
}
if (options.HasFlag(ExtractOptions.PreserveAttributes))
{
if (entry.Attrib.HasValue)
{
nf.Attributes = (FileAttributes)System.Enum.ToObject(typeof(FileAttributes), entry.Attrib.Value);
}
}
}
}
entry.PreserveExtractionOptions(destinationFileName, options);
}
#endif
}

View File

@@ -60,7 +60,7 @@ namespace SharpCompress.Archive
this IWritableArchive writableArchive,
string filePath, string searchPattern = "*.*", SearchOption searchOption = SearchOption.AllDirectories)
{
#if NET2
#if NET35
foreach (var path in Directory.GetFiles(filePath, searchPattern, searchOption))
#else
foreach (var path in Directory.EnumerateFiles(filePath, searchPattern, searchOption))

View File

@@ -6,12 +6,9 @@ namespace SharpCompress.Archive.Rar
{
internal class FileInfoRarFilePart : SeekableFilePart
{
private readonly FileInfoRarArchiveVolume volume;
internal FileInfoRarFilePart(FileInfoRarArchiveVolume volume, MarkHeader mh, FileHeader fh, FileInfo fi)
: base(mh, fh, volume.Stream, volume.Password)
{
this.volume = volume;
FileInfo = fi;
}

View File

@@ -64,7 +64,7 @@ namespace SharpCompress.Archive.Rar
{
var stream = Volumes.First().Stream;
stream.Position = 0;
return RarReader.Open(stream);
return RarReader.Open(stream, Password);
}
public override bool IsSolid
@@ -152,12 +152,8 @@ namespace SharpCompress.Archive.Rar
try
{
var headerFactory = new RarHeaderFactory(StreamingMode.Seekable, options);
RarHeader header = headerFactory.ReadHeaders(stream).FirstOrDefault();
if (header == null)
{
return false;
}
return Enum.IsDefined(typeof (HeaderType), header.HeaderType);
var markHeader = headerFactory.ReadHeaders(stream).FirstOrDefault() as MarkHeader;
return markHeader != null && markHeader.IsValid();
}
catch
{

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -73,8 +74,11 @@ namespace SharpCompress.Archive.Rar
public Stream OpenEntryStream()
{
return new RarStream(archive.Unpack, FileHeader,
new MultiVolumeReadOnlyStream(Parts.Cast<RarFilePart>(), archive));
if (archive.IsSolid)
{
throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives.");
}
return new RarStream(archive.Unpack, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast<RarFilePart>(), archive));
}
public bool IsComplete

View File

@@ -1,4 +1,5 @@
using System.IO;
using System;
using System.IO;
using SharpCompress.Common.SevenZip;
namespace SharpCompress.Archive.SevenZip

View File

@@ -116,7 +116,7 @@ namespace SharpCompress.Archive.Zip
try
{
ZipHeader header =
headerFactory.ReadStreamHeader(stream).FirstOrDefault(x => x != null && x.ZipHeaderType != ZipHeaderType.Split);
headerFactory.ReadStreamHeader(stream).FirstOrDefault(x => x.ZipHeaderType != ZipHeaderType.Split);
if (header == null)
{
return false;

View File

@@ -3,6 +3,7 @@ using System.IO;
using SharpCompress.Common.Tar.Headers;
using SharpCompress.Compressor;
using SharpCompress.Compressor.Deflate;
using SharpCompress.Converter;
namespace SharpCompress.Common.GZip
{
@@ -50,7 +51,7 @@ namespace SharpCompress.Common.GZip
if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8)
throw new ZlibException("Bad GZIP header.");
Int32 timet = BitConverter.ToInt32(header, 4);
Int32 timet = DataConverter.LittleEndian.GetInt32(header, 4);
DateModified = TarHeader.Epoch.AddSeconds(timet);
if ((header[3] & 0x04) == 0x04)
{

View File

@@ -4,10 +4,6 @@ namespace SharpCompress.Common.GZip
{
public class GZipVolume : Volume
{
#if !PORTABLE && !NETFX_CORE
private readonly FileInfo fileInfo;
#endif
public GZipVolume(Stream stream, Options options)
: base(stream, options)
{
@@ -17,7 +13,6 @@ namespace SharpCompress.Common.GZip
public GZipVolume(FileInfo fileInfo, Options options)
: base(fileInfo.OpenRead(), options)
{
this.fileInfo = fileInfo;
}
#endif

View File

@@ -0,0 +1,48 @@
using System;
using System.IO;
namespace SharpCompress.Common
{
internal static class IEntryExtensions
{
internal static void PreserveExtractionOptions(this IEntry entry, string destinationFileName,
ExtractOptions options)
{
if (options.HasFlag(ExtractOptions.PreserveFileTime) || options.HasFlag(ExtractOptions.PreserveAttributes))
{
FileInfo nf = new FileInfo(destinationFileName);
if (!nf.Exists)
{
return;
}
// update file time to original packed time
if (options.HasFlag(ExtractOptions.PreserveFileTime))
{
if (entry.CreatedTime.HasValue)
{
nf.CreationTime = entry.CreatedTime.Value;
}
if (entry.LastModifiedTime.HasValue)
{
nf.LastWriteTime = entry.LastModifiedTime.Value;
}
if (entry.LastAccessedTime.HasValue)
{
nf.LastAccessTime = entry.LastAccessedTime.Value;
}
}
if (options.HasFlag(ExtractOptions.PreserveAttributes))
{
if (entry.Attrib.HasValue)
{
nf.Attributes = (FileAttributes)System.Enum.ToObject(typeof(FileAttributes), entry.Attrib.Value);
}
}
}
}
}
}

View File

@@ -10,48 +10,15 @@ namespace SharpCompress.Common.Rar.Headers
internal bool IsValid()
{
if (!(HeadCRC == 0x6152))
{
return false;
}
if (!(HeaderType == HeaderType.MarkHeader))
{
return false;
}
if (!(Flags == 0x1a21))
{
return false;
}
if (!(HeaderSize == BaseBlockSize))
{
return false;
}
return true;
}
// Rar old signature: 52 45 7E 5E (not supported)
internal bool IsSignature()
{
bool valid = false;
/*byte[] d = new byte[BaseBlock.BaseBlockSize];
BinaryWriter writer = new BinaryWriter();
writer.Write(HeadCRC);
writer.Write((byte)HeaderType);
writer.Write(flags);
writer.Write(HeaderSize);
writer.Flush
if (d[0] == 0x52) {
if (d[1]==0x45 && d[2]==0x7e && d[3]==0x5e) {
oldFormat=true;
valid=true;
}
else if (d[1]==0x61 && d[2]==0x72 && d[3]==0x21 && d[4]==0x1a &&
d[5]==0x07 && d[6]==0x00) {
oldFormat=false;
valid=true;
}
}*/
return valid;
// Rar4 signature: 52 61 72 21 1A 07 00
return HeadCRC == 0x6152 &&
HeaderType == HeaderType.MarkHeader &&
Flags == 0x1A21 &&
HeaderSize == 0x07;
// Rar5 signature: 52 61 72 21 1A 07 10 00 (not supported yet)
}
internal bool OldFormat { get; private set; }

View File

@@ -93,7 +93,7 @@ namespace SharpCompress.Common.Rar.Headers
{
if (!Options.HasFlag(Options.KeepStreamsOpen))
{
#if NET2
#if NET35
reader.Close();
#else
reader.Dispose();

View File

@@ -1198,14 +1198,12 @@ namespace SharpCompress.Common.SevenZip
private class FolderUnpackStream : Stream
{
private ArchiveDatabase _db;
private int _otherIndex;
private int _startIndex;
private List<bool> _extractStatuses;
public FolderUnpackStream(ArchiveDatabase db, int p, int startIndex, List<bool> list)
{
this._db = db;
this._otherIndex = p;
this._startIndex = startIndex;
this._extractStatuses = list;
}
@@ -1275,12 +1273,7 @@ namespace SharpCompress.Common.SevenZip
private void OpenFile()
{
bool skip = !_extractStatuses[_currentIndex];
int index = _startIndex + _currentIndex;
int realIndex = _otherIndex + index;
//string filename = @"D:\_testdump\" + _db.Files[index].Name;
//Directory.CreateDirectory(Path.GetDirectoryName(filename));
//_stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Delete);
#if DEBUG
Log.WriteLine(_db.Files[index].Name);
#endif

View File

@@ -34,7 +34,6 @@ namespace SharpCompress.Common.SevenZip
#region Variables
private byte[] _buffer;
private int _origin;
private int _offset;
private int _ending;
@@ -45,7 +44,6 @@ namespace SharpCompress.Common.SevenZip
public DataReader(byte[] buffer, int offset, int length)
{
_buffer = buffer;
_origin = offset;
_offset = offset;
_ending = offset + length;
}

View File

@@ -4,6 +4,7 @@ using System.IO;
using System.Net;
#endif
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Common.Tar.Headers
{
@@ -64,11 +65,7 @@ namespace SharpCompress.Common.Tar.Headers
if (Size >= 0x1FFFFFFFF)
{
#if PORTABLE || NETFX_CORE
byte[] bytes = BitConverter.GetBytes(Utility.HostToNetworkOrder(Size));
#else
byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Size));
#endif
byte[] bytes = DataConverter.BigEndian.GetBytes(Size);
var bytes12 = new byte[12];
bytes.CopyTo(bytes12, 12 - bytes.Length);
bytes12[0] |= 0x80;
@@ -119,12 +116,7 @@ namespace SharpCompress.Common.Tar.Headers
EntryType = (EntryType) buffer[156];
if ((buffer[124] & 0x80) == 0x80) // if size in binary
{
long sizeBigEndian = BitConverter.ToInt64(buffer, 0x80);
#if PORTABLE || NETFX_CORE
Size = Utility.NetworkToHostOrder(sizeBigEndian);
#else
Size = IPAddress.NetworkToHostOrder(sizeBigEndian);
#endif
Size = DataConverter.BigEndian.GetInt64(buffer, 0x80);
}
else
{

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Common.Zip.Headers
{
@@ -68,13 +69,13 @@ namespace SharpCompress.Common.Zip.Headers
{
for (int i = 0; i < extra.Length-4;)
{
ExtraDataType type = (ExtraDataType) BitConverter.ToUInt16(extra, i);
ExtraDataType type = (ExtraDataType)DataConverter.LittleEndian.GetUInt16(extra, i);
if (!Enum.IsDefined(typeof (ExtraDataType), type))
{
type = ExtraDataType.NotImplementedExtraData;
}
ushort length = BitConverter.ToUInt16(extra, i + 2);
ushort length = DataConverter.LittleEndian.GetUInt16(extra, i + 2);
byte[] data = new byte[length];
Buffer.BlockCopy(extra, i + 4, data, 0, length);
Extra.Add(LocalEntryHeaderExtraFactory.Create(type,length,data));

View File

@@ -45,17 +45,18 @@ namespace SharpCompress.Common.Zip
lastEntryHeader = null;
uint headerBytes = reader.ReadUInt32();
header = ReadHeader(headerBytes, reader);
if (header != null) {
// entry could be zero bytes so we need to know that.
if(header.ZipHeaderType == ZipHeaderType.LocalEntry) {
bool isRecording = rewindableStream.IsRecording;
if (!isRecording) {
rewindableStream.StartRecording();
}
uint nextHeaderBytes = reader.ReadUInt32();
header.HasData = !IsHeader(nextHeaderBytes);
rewindableStream.Rewind(!isRecording);
//entry could be zero bytes so we need to know that.
if (header.ZipHeaderType == ZipHeaderType.LocalEntry)
{
bool isRecording = rewindableStream.IsRecording;
if (!isRecording)
{
rewindableStream.StartRecording();
}
uint nextHeaderBytes = reader.ReadUInt32();
header.HasData = !IsHeader(nextHeaderBytes);
rewindableStream.Rewind(!isRecording);
}
yield return header;
}

View File

@@ -3,6 +3,7 @@ using System.IO;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using SharpCompress.Converter;
namespace SharpCompress.Common.Zip
{
@@ -113,7 +114,7 @@ namespace SharpCompress.Common.Zip
: bytesRemaining;
// update the counter
Array.Copy(BitConverter.GetBytes(nonce++), 0, counter, 0, 4);
DataConverter.LittleEndian.PutBytes(counter, 0, nonce++);
// Determine if this is the final block
if ((bytesToRead == bytesRemaining) && (totalBytesLeftToRead == 0))

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Security.Cryptography;
using SharpCompress.Converter;
namespace SharpCompress.Common.Zip
{
@@ -117,7 +118,7 @@ namespace SharpCompress.Common.Zip
: bytesRemaining;
// update the counter
Array.Copy(BitConverter.GetBytes(nonce++), 0, counter, 0, 4);
DataConverter.LittleEndian.PutBytes(counter, 0, nonce++);
// Determine if this is the final block
if ((bytesToRead == bytesRemaining) && (totalBytesLeftToRead == 0))

View File

@@ -1,5 +1,6 @@
using System;
using System.Text;
using SharpCompress.Converter;
using SharpCompress.Crypto;
namespace SharpCompress.Common.Zip
@@ -56,10 +57,10 @@ namespace SharpCompress.Common.Zip
generatedVerifyValue = paramz.GetBytes(2);
short verify = BitConverter.ToInt16(passwordVerifyValue, 0);
short verify = DataConverter.LittleEndian.GetInt16(passwordVerifyValue, 0);
if (password != null)
{
short generated = BitConverter.ToInt16(generatedVerifyValue, 0);
short generated = DataConverter.LittleEndian.GetInt16(generatedVerifyValue, 0);
if (verify != generated)
throw new InvalidFormatException("bad password");
}

View File

@@ -1,4 +1,5 @@
using System;
using SharpCompress.Converter;
namespace SharpCompress.Common.Zip
{
@@ -54,10 +55,10 @@ namespace SharpCompress.Common.Zip
IvBytes = rfc2898.GetBytes(KeySizeInBytes);
generatedVerifyValue = rfc2898.GetBytes(2);
short verify = BitConverter.ToInt16(passwordVerifyValue, 0);
short verify = DataConverter.LittleEndian.GetInt16(passwordVerifyValue, 0);
if (password != null)
{
short generated = BitConverter.ToInt16(generatedVerifyValue, 0);
short generated = DataConverter.LittleEndian.GetInt16(generatedVerifyValue, 0);
if (verify != generated)
throw new InvalidFormatException("bad password");
}

View File

@@ -7,6 +7,7 @@ using SharpCompress.Compressor.BZip2;
using SharpCompress.Compressor.Deflate;
using SharpCompress.Compressor.LZMA;
using SharpCompress.Compressor.PPMd;
using SharpCompress.Converter;
using SharpCompress.IO;
namespace SharpCompress.Common.Zip
@@ -108,19 +109,19 @@ namespace SharpCompress.Common.Zip
{
throw new InvalidFormatException("Winzip data length is not 7.");
}
ushort method = BitConverter.ToUInt16(data.DataBytes, 0);
ushort method = DataConverter.LittleEndian.GetUInt16(data.DataBytes, 0);
if (method != 0x01 && method != 0x02)
{
throw new InvalidFormatException("Unexpected vendor version number for WinZip AES metadata");
}
ushort vendorId = BitConverter.ToUInt16(data.DataBytes, 2);
ushort vendorId = DataConverter.LittleEndian.GetUInt16(data.DataBytes, 2);
if (vendorId != 0x4541)
{
throw new InvalidFormatException("Unexpected vendor ID for WinZip AES metadata");
}
Header.CompressionMethod = (ZipCompressionMethod)BitConverter.ToUInt16(data.DataBytes, 5);
Header.CompressionMethod = (ZipCompressionMethod)DataConverter.LittleEndian.GetUInt16(data.DataBytes, 5);
return CreateDecompressionStream(stream);
}
default:

View File

@@ -87,7 +87,7 @@ namespace SharpCompress.Common.Zip
return entry;
}
default:
return null;
throw new NotSupportedException("Unknown header: " + headerBytes);
}
}

View File

@@ -670,6 +670,7 @@ namespace SharpCompress.Compressor.Deflate
send_bits((tree[c2] & 0xffff), (tree[c2 + 1] & 0xffff));
}
#pragma warning disable 675 // workaround for Visual Studio 2015 compiler bug: https://github.com/dotnet/roslyn/issues/4027
internal void send_bits(int value, int length)
{
int len = length;
@@ -677,10 +678,10 @@ namespace SharpCompress.Compressor.Deflate
{
if (bi_valid > (int) Buf_size - len)
{
//int val = value;
// bi_buf |= (val << bi_valid);
int x = (value << bi_valid) & 0xffff;
bi_buf = (short)((int)bi_buf | x);
bi_buf |= (short)((value << bi_valid) & 0xffff);
//put_short(bi_buf);
pending[pendingCount++] = (byte) bi_buf;
pending[pendingCount++] = (byte) (bi_buf >> 8);
@@ -691,14 +692,13 @@ namespace SharpCompress.Compressor.Deflate
}
else
{
// bi_buf |= (val << bi_valid);
int x = (value << bi_valid) & 0xffff;
bi_buf = (short)((int)bi_buf | x);
// bi_buf |= (value) << bi_valid;
bi_buf |= (short)((value << bi_valid) & 0xffff);
bi_valid += len;
}
}
}
#pragma warning restore 675
// Send one empty static block to give enough lookahead for inflate.
// This takes 10 bits, of which 7 may remain in the bit buffer.

View File

@@ -30,6 +30,7 @@
using System;
using System.IO;
using SharpCompress.Common;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.Deflate
{
@@ -417,7 +418,7 @@ namespace SharpCompress.Compressor.Deflate
LastModified = DateTime.Now;
TimeSpan delta = LastModified.Value - UnixEpoch;
var timet = (Int32) delta.TotalSeconds;
Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4);
DataConverter.LittleEndian.PutBytes(header, i, timet);
i += 4;
// xflg

View File

@@ -895,6 +895,11 @@ namespace SharpCompress.Compressor.Deflate
r = ZlibConstants.Z_OK;
else
{
// Handling missing trailing bit(s)
var tmp_tindex = (tree_index + (b & InternalInflateConstants.InflateMask[k]))*3;
if (k >= tree[tmp_tindex + 1])
break;
blocks.bitb = b;
blocks.bitk = k;
z.AvailableBytesIn = n;
@@ -998,6 +1003,11 @@ namespace SharpCompress.Compressor.Deflate
r = ZlibConstants.Z_OK;
else
{
// Handling missing trailing bit(s)
var tmp_tindex = (tree_index + (b & InternalInflateConstants.InflateMask[k]))*3;
if (k >= tree[tmp_tindex + 1])
break;
blocks.bitb = b;
blocks.bitk = k;
z.AvailableBytesIn = n;

View File

@@ -27,6 +27,7 @@
using System;
using SharpCompress.Common;
using SharpCompress.Common.Tar.Headers;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.Deflate
{
@@ -221,9 +222,9 @@ namespace SharpCompress.Compressor.Deflate
{
// Emit the GZIP trailer: CRC32 and size mod 2^32
int c1 = crc.Crc32Result;
_stream.Write(BitConverter.GetBytes(c1), 0, 4);
_stream.Write(DataConverter.LittleEndian.GetBytes(c1), 0, 4);
int c2 = (Int32)(crc.TotalBytesRead & 0x00000000FFFFFFFF);
_stream.Write(BitConverter.GetBytes(c2), 0, 4);
_stream.Write(DataConverter.LittleEndian.GetBytes(c2), 0, 4);
}
else
{
@@ -267,9 +268,9 @@ namespace SharpCompress.Compressor.Deflate
}
Int32 crc32_expected = BitConverter.ToInt32(trailer, 0);
Int32 crc32_expected = DataConverter.LittleEndian.GetInt32(trailer, 0);
Int32 crc32_actual = crc.Crc32Result;
Int32 isize_expected = BitConverter.ToInt32(trailer, 4);
Int32 isize_expected = DataConverter.LittleEndian.GetInt32(trailer, 4);
Int32 isize_actual = (Int32)(_z.TotalBytesOut & 0x00000000FFFFFFFF);
if (crc32_actual != crc32_expected)
@@ -405,7 +406,7 @@ namespace SharpCompress.Compressor.Deflate
if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8)
throw new ZlibException("Bad GZIP header.");
Int32 timet = BitConverter.ToInt32(header, 4);
Int32 timet = DataConverter.LittleEndian.GetInt32(header, 4);
_GzipMtime = TarHeader.Epoch.AddSeconds(timet);
totalBytesRead += n;
if ((header[3] & 0x04) == 0x04)

View File

@@ -99,7 +99,6 @@ namespace SharpCompress.Compressor.LZMA
private RangeDecoder mRangeDecoder;
private StatusDecoder[] mStatusDecoder;
private long mWritten;
private long mLimit;
private IEnumerator<byte> mIter;
private bool mFinished;
private bool isDisposed;
@@ -112,7 +111,6 @@ namespace SharpCompress.Compressor.LZMA
if (streams.Length != 4)
throw new NotSupportedException();
mLimit = limit;
mMainStream = streams[0];
mCallStream = streams[1];
mJumpStream = streams[2];

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using SharpCompress.Compressor.LZMA.LZ;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.LZMA
{
@@ -56,7 +57,7 @@ namespace SharpCompress.Compressor.LZMA
if (!isLZMA2)
{
dictionarySize = BitConverter.ToInt32(properties, 1);
dictionarySize = DataConverter.LittleEndian.GetInt32(properties, 1);
outWindow.Create(dictionarySize);
if (presetDictionary != null)
outWindow.Train(presetDictionary);

View File

@@ -1,4 +1,5 @@
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd.H
{
@@ -19,9 +20,9 @@ namespace SharpCompress.Compressor.PPMd.H
internal int SummFreq
{
get { return Utility.readShortLittleEndian(Memory, Address) & 0xffff; }
get { return DataConverter.LittleEndian.GetInt16(Memory, Address) & 0xffff; }
set { Utility.WriteLittleEndian(Memory, Address, (short) value); }
set { DataConverter.LittleEndian.PutBytes(Memory, Address, (short)value); }
}
internal FreqData Initialize(byte[] mem)
@@ -31,12 +32,14 @@ namespace SharpCompress.Compressor.PPMd.H
internal void IncrementSummFreq(int dSummFreq)
{
Utility.incShortLittleEndian(Memory, Address, (short) dSummFreq);
short summFreq = DataConverter.LittleEndian.GetInt16(Memory, Address);
summFreq += (short)dSummFreq;
DataConverter.LittleEndian.PutBytes(Memory, Address, summFreq);
}
internal int GetStats()
{
return Utility.readIntLittleEndian(Memory, Address + 2);
return DataConverter.LittleEndian.GetInt32(Memory, Address + 2);
}
internal virtual void SetStats(State state)
@@ -46,7 +49,7 @@ namespace SharpCompress.Compressor.PPMd.H
internal void SetStats(int state)
{
Utility.WriteLittleEndian(Memory, Address + 2, state);
DataConverter.LittleEndian.PutBytes(Memory, Address + 2, state);
}
public override System.String ToString()

View File

@@ -1,4 +1,5 @@
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd.H
{
@@ -21,7 +22,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
numStats = Utility.readShortLittleEndian(Memory, Address) & 0xffff;
numStats = DataConverter.LittleEndian.GetInt16(Memory, Address) & 0xffff;
}
return numStats;
}
@@ -31,7 +32,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.numStats = value & 0xffff;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address, (short) value);
DataConverter.LittleEndian.PutBytes(Memory, Address, (short) value);
}
}
}
@@ -103,7 +104,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
suffix = Utility.readIntLittleEndian(Memory, Address + 8);
suffix = DataConverter.LittleEndian.GetInt32(Memory, Address + 8);
}
return suffix;
}
@@ -118,7 +119,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.suffix = suffix;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address + 8, suffix);
DataConverter.LittleEndian.PutBytes(Memory, Address + 8, suffix);
}
}

View File

@@ -1,3 +1,5 @@
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd.H
{
internal class RarMemBlock : Pointer
@@ -19,7 +21,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
stamp = Utility.readShortLittleEndian(Memory, Address) & 0xffff;
stamp = DataConverter.LittleEndian.GetInt16(Memory, Address) & 0xffff;
}
return stamp;
}
@@ -29,7 +31,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.stamp = value;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address, (short) value);
DataConverter.LittleEndian.PutBytes(Memory, Address, (short)value);
}
}
}
@@ -60,7 +62,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
next = Utility.readIntLittleEndian(Memory, Address + 4);
next = DataConverter.LittleEndian.GetInt32(Memory, Address + 4);
}
return next;
}
@@ -75,7 +77,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.next = next;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address + 4, next);
DataConverter.LittleEndian.PutBytes(Memory, Address + 4, next);
}
}
@@ -83,7 +85,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
NU = Utility.readShortLittleEndian(Memory, Address + 2) & 0xffff;
NU = DataConverter.LittleEndian.GetInt16(Memory, Address + 2) & 0xffff;
}
return NU;
}
@@ -93,7 +95,7 @@ namespace SharpCompress.Compressor.PPMd.H
NU = nu & 0xffff;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address + 2, (short) nu);
DataConverter.LittleEndian.PutBytes(Memory, Address + 2, (short)nu);
}
}
@@ -101,7 +103,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
prev = Utility.readIntLittleEndian(Memory, Address + 8);
prev = DataConverter.LittleEndian.GetInt32(Memory, Address + 8);
}
return prev;
}
@@ -116,7 +118,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.prev = prev;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address + 8, prev);
DataConverter.LittleEndian.PutBytes(Memory, Address + 8, prev);
}
}
}

View File

@@ -1,4 +1,5 @@
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd.H
{
@@ -17,7 +18,7 @@ namespace SharpCompress.Compressor.PPMd.H
{
if (Memory != null)
{
next = Utility.readIntLittleEndian(Memory, Address);
next = DataConverter.LittleEndian.GetInt32(Memory, Address);
}
return next;
}
@@ -32,7 +33,7 @@ namespace SharpCompress.Compressor.PPMd.H
this.next = next;
if (Memory != null)
{
Utility.WriteLittleEndian(Memory, Address, next);
DataConverter.LittleEndian.PutBytes(Memory, Address, next);
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Text;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd.H
{
@@ -38,7 +39,7 @@ namespace SharpCompress.Compressor.PPMd.H
internal int GetSuccessor()
{
return Utility.readIntLittleEndian(Memory, Address + 2);
return DataConverter.LittleEndian.GetInt32(Memory, Address + 2);
}
internal void SetSuccessor(PPMContext successor)
@@ -48,7 +49,7 @@ namespace SharpCompress.Compressor.PPMd.H
internal void SetSuccessor(int successor)
{
Utility.WriteLittleEndian(Memory, Address + 2, successor);
DataConverter.LittleEndian.PutBytes(Memory, Address + 2, successor);
}
internal void SetValues(StateRef state)

View File

@@ -1,4 +1,5 @@
using System;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.PPMd
{
@@ -39,7 +40,7 @@ namespace SharpCompress.Compressor.PPMd
{
if (properties.Length == 2)
{
ushort props = BitConverter.ToUInt16(properties, 0);
ushort props = DataConverter.LittleEndian.GetUInt16(properties, 0);
AllocatorSize = (((props >> 4) & 0xff) + 1) << 20;
ModelOrder = (props & 0x0f) + 1;
ModelRestorationMethod = (I1.ModelRestorationMethod) (props >> 12);
@@ -47,7 +48,7 @@ namespace SharpCompress.Compressor.PPMd
else if (properties.Length == 5)
{
Version = PpmdVersion.H7z;
AllocatorSize = BitConverter.ToInt32(properties, 1);
AllocatorSize = DataConverter.LittleEndian.GetInt32(properties, 1);
ModelOrder = properties[0];
}
}
@@ -72,7 +73,7 @@ namespace SharpCompress.Compressor.PPMd
get
{
return
BitConverter.GetBytes(
DataConverter.LittleEndian.GetBytes(
(ushort)
((ModelOrder - 1) + (((AllocatorSize >> 20) - 1) << 4) + ((ushort) ModelRestorationMethod << 12)));
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using SharpCompress.Converter;
namespace SharpCompress.Compressor.Rar.VM
{
@@ -77,11 +78,12 @@ namespace SharpCompress.Compressor.Rar.VM
{
if (IsVMMem(mem))
{
return Utility.readIntLittleEndian(mem, offset);
return DataConverter.LittleEndian.GetInt32(mem, offset);
}
else
{
return Utility.readIntBigEndian(mem, offset);
return DataConverter.BigEndian.GetInt32(mem, offset);
}
}
}
@@ -103,19 +105,11 @@ namespace SharpCompress.Compressor.Rar.VM
{
if (IsVMMem(mem))
{
Utility.WriteLittleEndian(mem, offset, value);
// Mem[offset + 0] = (byte) value;
// Mem[offset + 1] = (byte) (value >>> 8);
// Mem[offset + 2] = (byte) (value >>> 16);
// Mem[offset + 3] = (byte) (value >>> 24);
DataConverter.LittleEndian.PutBytes(mem, offset, value);
}
else
{
Utility.writeIntBigEndian(mem, offset, value);
// Mem[offset + 3] = (byte) value;
// Mem[offset + 2] = (byte) (value >>> 8);
// Mem[offset + 1] = (byte) (value >>> 16);
// Mem[offset + 0] = (byte) (value >>> 24);
DataConverter.BigEndian.PutBytes(mem, offset, value);
}
}
// #define SET_VALUE(ByteMode,Addr,Value) SetValue(ByteMode,(uint
@@ -136,12 +130,12 @@ namespace SharpCompress.Compressor.Rar.VM
if (cmdOp.Type == VMOpType.VM_OPREGMEM)
{
int pos = (cmdOp.Offset + cmdOp.Base) & VM_MEMMASK;
ret = Utility.readIntLittleEndian(Mem, pos);
ret = DataConverter.LittleEndian.GetInt32(Mem, pos);
}
else
{
int pos = cmdOp.Offset;
ret = Utility.readIntLittleEndian(Mem, pos);
ret = DataConverter.LittleEndian.GetInt32(Mem, pos);
}
return ret;
}

View File

@@ -0,0 +1,237 @@
using System;
namespace SharpCompress.Converter
{
// This is a portable version of Mono's DataConverter class with just the small subset of functionality
// needed by SharpCompress. Portable in this case means that it contains no unsafe code.
//
// This class simply wraps BitConverter and reverses byte arrays when endianess doesn't match the host's.
//
// Everything public in this class must match signatures in Mono's DataConverter.
abstract class DataConverter
{
static readonly DataConverter copyConverter = new CopyConverter();
static readonly DataConverter swapConverter = new SwapConverter();
static readonly bool isLittleEndian = BitConverter.IsLittleEndian;
public static DataConverter LittleEndian
{
get { return isLittleEndian ? copyConverter : swapConverter; }
}
public static DataConverter BigEndian
{
get { return isLittleEndian ? swapConverter : copyConverter; }
}
public abstract Int16 GetInt16(byte[] data, int index);
public abstract UInt16 GetUInt16(byte[] data, int index);
public abstract Int32 GetInt32(byte[] data, int index);
public abstract UInt32 GetUInt32(byte[] data, int index);
public abstract Int64 GetInt64(byte[] data, int index);
public abstract UInt64 GetUInt64(byte[] data, int index);
public abstract byte[] GetBytes(Int16 value);
public abstract byte[] GetBytes(UInt16 value);
public abstract byte[] GetBytes(Int32 value);
public abstract byte[] GetBytes(UInt32 value);
public abstract byte[] GetBytes(Int64 value);
public abstract byte[] GetBytes(UInt64 value);
public void PutBytes(byte[] data, int index, Int16 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 2);
}
public void PutBytes(byte[] data, int index, UInt16 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 2);
}
public void PutBytes(byte[] data, int index, Int32 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 4);
}
public void PutBytes(byte[] data, int index, UInt32 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 4);
}
public void PutBytes(byte[] data, int index, Int64 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 8);
}
public void PutBytes(byte[] data, int index, UInt64 value)
{
byte[] temp = GetBytes(value);
Array.Copy(temp, 0, data, index, 8);
}
// CopyConverter wraps BitConverter making all conversions host endian
class CopyConverter : DataConverter
{
public override Int16 GetInt16(byte[] data, int index)
{
return BitConverter.ToInt16(data, index);
}
public override UInt16 GetUInt16(byte[] data, int index)
{
return BitConverter.ToUInt16(data, index);
}
public override Int32 GetInt32(byte[] data, int index)
{
return BitConverter.ToInt32(data, index);
}
public override UInt32 GetUInt32(byte[] data, int index)
{
return BitConverter.ToUInt32(data, index);
}
public override Int64 GetInt64(byte[] data, int index)
{
return BitConverter.ToInt64(data, index);
}
public override UInt64 GetUInt64(byte[] data, int index)
{
return BitConverter.ToUInt64(data, index);
}
public override byte[] GetBytes(Int16 value)
{
return BitConverter.GetBytes(value);
}
public override byte[] GetBytes(UInt16 value)
{
return BitConverter.GetBytes(value);
}
public override byte[] GetBytes(Int32 value)
{
return BitConverter.GetBytes(value);
}
public override byte[] GetBytes(UInt32 value)
{
return BitConverter.GetBytes(value);
}
public override byte[] GetBytes(Int64 value)
{
return BitConverter.GetBytes(value);
}
public override byte[] GetBytes(UInt64 value)
{
return BitConverter.GetBytes(value);
}
}
// SwapConverter wraps and reverses BitConverter making all conversions the opposite of host endian
class SwapConverter : DataConverter
{
public override Int16 GetInt16(byte[] data, int index)
{
byte[] temp = new byte[2];
Array.Copy(data, index, temp, 0, 2);
Array.Reverse(temp);
return BitConverter.ToInt16(temp, 0);
}
public override UInt16 GetUInt16(byte[] data, int index)
{
byte[] temp = new byte[2];
Array.Copy(data, index, temp, 0, 2);
Array.Reverse(temp);
return BitConverter.ToUInt16(temp, 0);
}
public override Int32 GetInt32(byte[] data, int index)
{
byte[] temp = new byte[4];
Array.Copy(data, index, temp, 0, 4);
Array.Reverse(temp);
return BitConverter.ToInt32(temp, 0);
}
public override UInt32 GetUInt32(byte[] data, int index)
{
byte[] temp = new byte[4];
Array.Copy(data, index, temp, 0, 4);
Array.Reverse(temp);
return BitConverter.ToUInt32(temp, 0);
}
public override Int64 GetInt64(byte[] data, int index)
{
byte[] temp = new byte[8];
Array.Copy(data, index, temp, 0, 8);
Array.Reverse(temp);
return BitConverter.ToInt64(temp, 0);
}
public override UInt64 GetUInt64(byte[] data, int index)
{
byte[] temp = new byte[8];
Array.Copy(data, index, temp, 0, 8);
Array.Reverse(temp);
return BitConverter.ToUInt64(temp, 0);
}
public override byte[] GetBytes(Int16 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
public override byte[] GetBytes(UInt16 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
public override byte[] GetBytes(Int32 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
public override byte[] GetBytes(UInt32 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
public override byte[] GetBytes(Int64 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
public override byte[] GetBytes(UInt64 value)
{
byte[] ret = BitConverter.GetBytes(value);
Array.Reverse(ret);
return ret;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,7 @@ using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Macs;
using Org.BouncyCastle.Crypto.Parameters;
using SharpCompress.Converter;
namespace SharpCompress.Crypto
{
@@ -68,7 +69,7 @@ namespace SharpCompress.Crypto
private byte[] Hash()
{
byte[] array = UIntToOctet(block);
byte[] array = DataConverter.BigEndian.GetBytes(block);
ICipherParameters param = new KeyParameter(password);
hMac.Init(param);
@@ -96,24 +97,6 @@ namespace SharpCompress.Crypto
block += 1u;
return array3;
}
internal static byte[] UIntToOctet(uint i)
{
byte[] bytes = BitConverter.GetBytes(i);
byte[] result = new[]
{
bytes[3],
bytes[2],
bytes[1],
bytes[0]
};
if (!BitConverter.IsLittleEndian)
{
return bytes;
}
return result;
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
#if NET35
using System;
namespace SharpCompress
{
@@ -12,4 +13,5 @@ namespace SharpCompress
return (value & flagVal) == flagVal;
}
}
}
}
#endif

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Linq;
using SharpCompress.Converter;
namespace SharpCompress.IO
{
@@ -36,7 +37,7 @@ namespace SharpCompress.IO
public override bool ReadBoolean()
{
return BitConverter.ToBoolean(ReadBytes(1), 0);
return ReadBytes(1).Single() != 0;
}
public override byte ReadByte()
@@ -68,39 +69,28 @@ namespace SharpCompress.IO
#if !PORTABLE
public override decimal ReadDecimal()
{
return ByteArrayToDecimal(ReadBytes(16), 0);
}
private decimal ByteArrayToDecimal(byte[] src, int offset)
{
//http://stackoverflow.com/a/16984356/385387
var i1 = BitConverter.ToInt32(src, offset);
var i2 = BitConverter.ToInt32(src, offset + 4);
var i3 = BitConverter.ToInt32(src, offset + 8);
var i4 = BitConverter.ToInt32(src, offset + 12);
return new decimal(new[] { i1, i2, i3, i4 });
throw new NotSupportedException();
}
#endif
public override double ReadDouble()
{
return BitConverter.ToDouble(ReadBytes(8), 0);
throw new NotSupportedException();
}
public override short ReadInt16()
{
return BitConverter.ToInt16(ReadBytes(2), 0);
return DataConverter.LittleEndian.GetInt16(ReadBytes(2), 0);
}
public override int ReadInt32()
{
return BitConverter.ToInt32(ReadBytes(4), 0);
return DataConverter.LittleEndian.GetInt32(ReadBytes(4), 0);
}
public override long ReadInt64()
{
return BitConverter.ToInt64(ReadBytes(8), 0);
return DataConverter.LittleEndian.GetInt64(ReadBytes(8), 0);
}
public override sbyte ReadSByte()
@@ -110,7 +100,7 @@ namespace SharpCompress.IO
public override float ReadSingle()
{
return BitConverter.ToSingle(ReadBytes(4), 0);
throw new NotSupportedException();
}
public override string ReadString()
@@ -120,17 +110,17 @@ namespace SharpCompress.IO
public override ushort ReadUInt16()
{
return BitConverter.ToUInt16(ReadBytes(2), 0);
return DataConverter.LittleEndian.GetUInt16(ReadBytes(2), 0);
}
public override uint ReadUInt32()
{
return BitConverter.ToUInt32(ReadBytes(4), 0);
return DataConverter.LittleEndian.GetUInt32(ReadBytes(4), 0);
}
public override ulong ReadUInt64()
{
return BitConverter.ToUInt64(ReadBytes(8), 0);
return DataConverter.LittleEndian.GetUInt64(ReadBytes(8), 0);
}
}
}

View File

@@ -89,6 +89,7 @@ namespace SharpCompress.Reader
// s.TransferTo(fs);
//}
}
reader.Entry.PreserveExtractionOptions(destinationFileName, options);
}
#endif
}

View File

@@ -61,12 +61,6 @@ namespace SharpCompress.Reader
}
}
rewindableStream.Rewind(false);
if (TarArchive.IsTarFile(rewindableStream))
{
rewindableStream.Rewind(true);
return TarReader.Open(rewindableStream, options);
}
rewindableStream.Rewind(false);
if (RarArchive.IsRarFile(rewindableStream, options))
{
@@ -74,6 +68,12 @@ namespace SharpCompress.Reader
return RarReader.Open(rewindableStream, options);
}
rewindableStream.Rewind(false);
if (TarArchive.IsTarFile(rewindableStream))
{
rewindableStream.Rewind(true);
return TarReader.Open(rewindableStream, options);
}
throw new InvalidOperationException("Cannot determine compressed stream type. Supported Reader Formats: Zip, GZip, BZip2, Tar, Rar");
}
}

View File

@@ -270,6 +270,7 @@
<Compile Include="Compressor\Rar\VM\VMPreparedProgram.cs" />
<Compile Include="Compressor\Rar\VM\VMStandardFilters.cs" />
<Compile Include="Compressor\Rar\VM\VMStandardFilterSignature.cs" />
<Compile Include="Converter\DataConverter.Portable.cs" />
<Compile Include="Crypto\BufferedBlockCipher.cs" />
<Compile Include="Crypto\BufferedCipherBase.cs" />
<Compile Include="Crypto\CryptoException.cs" />
@@ -287,6 +288,7 @@
<Compile Include="Crypto\PBKDF2.cs" />
<Compile Include="Crypto\RijndaelEngine.cs" />
<Compile Include="Crypto\Sha1Digest.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="IO\CountingWritableSubStream.cs" />
<Compile Include="IO\ListeningStream.cs" />
<Compile Include="IO\MarkingBinaryReader.cs" />

View File

@@ -63,7 +63,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<DefineConstants>TRACE;UNSIGNED</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
@@ -129,6 +129,7 @@
<Compile Include="Common\FilePart.cs" />
<Compile Include="Common\Entry.cs" />
<Compile Include="Common\IEntry.cs" />
<Compile Include="Common\IEntry.Extensions.cs" />
<Compile Include="Common\IVolume.cs" />
<Compile Include="Common\Rar\RarCryptoWrapper.cs" />
<Compile Include="Common\Rar\RarRijndael.Portable.cs" />
@@ -239,6 +240,7 @@
<Compile Include="Compressor\PPMd\PpmdProperties.cs" />
<Compile Include="Compressor\PPMd\PpmdStream.cs" />
<Compile Include="Compressor\Rar\RarStream.cs" />
<Compile Include="Converter\DataConverter.Portable.cs" />
<Compile Include="Crypto\BigInteger.cs" />
<Compile Include="Crypto\BufferedBlockCipher.cs" />
<Compile Include="Crypto\BufferedCipherBase.cs" />
@@ -256,6 +258,7 @@
<Compile Include="Crypto\PBKDF2.cs" />
<Compile Include="Crypto\RijndaelEngine.cs" />
<Compile Include="Crypto\Sha1Digest.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="IO\CountingWritableSubStream.cs" />
<Compile Include="Common\EntryStream.cs">
<SubType>Code</SubType>

View File

@@ -65,7 +65,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<DefineConstants>TRACE;UNSIGNED</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
@@ -131,6 +131,7 @@
<Compile Include="Common\FilePart.cs" />
<Compile Include="Common\Entry.cs" />
<Compile Include="Common\IEntry.cs" />
<Compile Include="Common\IEntry.Extensions.cs" />
<Compile Include="Common\IVolume.cs" />
<Compile Include="Common\Rar\RarCryptoWrapper.cs" />
<Compile Include="Common\Rar\RarRijndael.cs" />
@@ -243,6 +244,8 @@
<Compile Include="Compressor\PPMd\PpmdProperties.cs" />
<Compile Include="Compressor\PPMd\PpmdStream.cs" />
<Compile Include="Compressor\Rar\RarStream.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="Converter\DataConverter.cs" />
<Compile Include="IO\CountingWritableSubStream.cs" />
<Compile Include="Common\EntryStream.cs">
<SubType>Code</SubType>

View File

@@ -256,6 +256,7 @@
<Compile Include="Compressor\Rar\VM\VMPreparedProgram.cs" />
<Compile Include="Compressor\Rar\VM\VMStandardFilters.cs" />
<Compile Include="Compressor\Rar\VM\VMStandardFilterSignature.cs" />
<Compile Include="Converter\DataConverter.Portable.cs" />
<Compile Include="Crypto\BigInteger.cs" />
<Compile Include="Crypto\BufferedBlockCipher.cs" />
<Compile Include="Crypto\BufferedCipherBase.cs" />
@@ -273,6 +274,7 @@
<Compile Include="Crypto\RijndaelEngine.cs" />
<Compile Include="Crypto\Pack.cs" />
<Compile Include="Crypto\Sha1Digest.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="IO\AppendingStream.cs" />
<Compile Include="IO\CountingWritableSubStream.cs" />
<Compile Include="IO\ListeningStream.cs" />

View File

@@ -131,6 +131,7 @@
<Compile Include="Common\FilePart.cs" />
<Compile Include="Common\Entry.cs" />
<Compile Include="Common\IEntry.cs" />
<Compile Include="Common\IEntry.Extensions.cs" />
<Compile Include="Common\IVolume.cs" />
<Compile Include="Common\Rar\RarCryptoWrapper.cs" />
<Compile Include="Common\Rar\RarRijndael.cs" />
@@ -242,7 +243,9 @@
<Compile Include="Compressor\PPMd\I1\See2Context.cs" />
<Compile Include="Compressor\PPMd\PpmdProperties.cs" />
<Compile Include="Compressor\PPMd\PpmdStream.cs" />
<Compile Include="Compressor\Rar\RarStream.cs" />
<Compile Include="Compressor\Rar\RarStream.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="Converter\DataConverter.cs" />
<Compile Include="IO\CountingWritableSubStream.cs" />
<Compile Include="Common\EntryStream.cs">
<SubType>Code</SubType>

View File

@@ -2,9 +2,6 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using SharpCompress.Archive;
using SharpCompress.Common;
using SharpCompress.IO;
namespace SharpCompress
{
@@ -29,17 +26,6 @@ namespace SharpCompress
return (number >> bits) + (2 << ~bits);
}
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
public static int URShift(int number, long bits)
{
return URShift(number, (int)bits);
}
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
@@ -54,17 +40,6 @@ namespace SharpCompress
return (number >> bits) + (2L << ~bits);
}
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
public static long URShift(long number, long bits)
{
return URShift(number, (int)bits);
}
/// <summary>
/// Fills the array with an specific value from an specific index to an specific index.
/// </summary>
@@ -120,139 +95,6 @@ namespace SharpCompress
}
}
/// <summary> Read a int value from the byte array at the given position (Big Endian)
///
/// </summary>
/// <param name="array">the array to read from
/// </param>
/// <param name="pos">the offset
/// </param>
/// <returns> the value
/// </returns>
public static int readIntBigEndian(byte[] array, int pos)
{
int temp = 0;
temp |= array[pos] & 0xff;
temp <<= 8;
temp |= array[pos + 1] & 0xff;
temp <<= 8;
temp |= array[pos + 2] & 0xff;
temp <<= 8;
temp |= array[pos + 3] & 0xff;
return temp;
}
/// <summary> Read a short value from the byte array at the given position (little
/// Endian)
///
/// </summary>
/// <param name="array">the array to read from
/// </param>
/// <param name="pos">the offset
/// </param>
/// <returns> the value
/// </returns>
public static short readShortLittleEndian(byte[] array, int pos)
{
return BitConverter.ToInt16(array, pos);
}
/// <summary> Read an int value from the byte array at the given position (little
/// Endian)
///
/// </summary>
/// <param name="array">the array to read from
/// </param>
/// <param name="pos">the offset
/// </param>
/// <returns> the value
/// </returns>
public static int readIntLittleEndian(byte[] array, int pos)
{
return BitConverter.ToInt32(array, pos);
}
/// <summary> Write an int value into the byte array at the given position (Big endian)
///
/// </summary>
/// <param name="array">the array
/// </param>
/// <param name="pos">the offset
/// </param>
/// <param name="value">the value to write
/// </param>
public static void writeIntBigEndian(byte[] array, int pos, int value)
{
array[pos] = (byte)((Utility.URShift(value, 24)) & 0xff);
array[pos + 1] = (byte)((Utility.URShift(value, 16)) & 0xff);
array[pos + 2] = (byte)((Utility.URShift(value, 8)) & 0xff);
array[pos + 3] = (byte)((value) & 0xff);
}
/// <summary> Write a short value into the byte array at the given position (little
/// endian)
///
/// </summary>
/// <param name="array">the array
/// </param>
/// <param name="pos">the offset
/// </param>
/// <param name="value">the value to write
/// </param>
public static void WriteLittleEndian(byte[] array, int pos, short value)
{
byte[] newBytes = BitConverter.GetBytes(value);
if (!BitConverter.IsLittleEndian)
Array.Reverse(newBytes);
Array.Copy(newBytes, 0, array, pos, newBytes.Length);
}
/// <summary> Increment a short value at the specified position by the specified amount
/// (little endian).
/// </summary>
public static void incShortLittleEndian(byte[] array, int pos, short incrementValue)
{
short existingValue = BitConverter.ToInt16(array, pos);
existingValue += incrementValue;
WriteLittleEndian(array, pos, existingValue);
//int c = Utility.URShift(((array[pos] & 0xff) + (dv & 0xff)), 8);
//array[pos] = (byte)(array[pos] + (dv & 0xff));
//if ((c > 0) || ((dv & 0xff00) != 0))
//{
// array[pos + 1] = (byte)(array[pos + 1] + ((Utility.URShift(dv, 8)) & 0xff) + c);
//}
}
/// <summary> Write an int value into the byte array at the given position (little
/// endian)
///
/// </summary>
/// <param name="array">the array
/// </param>
/// <param name="pos">the offset
/// </param>
/// <param name="value">the value to write
/// </param>
public static void WriteLittleEndian(byte[] array, int pos, int value)
{
byte[] newBytes = BitConverter.GetBytes(value);
if (!BitConverter.IsLittleEndian)
Array.Reverse(newBytes);
Array.Copy(newBytes, 0, array, pos, newBytes.Length);
}
public static void Initialize<T>(this T[] array, Func<T> func)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = func();
}
}
public static void AddRange<T>(this ICollection<T> destination, IEnumerable<T> source)
{
foreach (T item in source)
@@ -324,18 +166,6 @@ namespace SharpCompress
} while (source.Read(buffer, 0, buffer.Length) == buffer.Length);
}
public static byte[] UInt32ToBigEndianBytes(uint x)
{
return new byte[]
{
(byte) ((x >> 24) & 0xff),
(byte) ((x >> 16) & 0xff),
(byte) ((x >> 8) & 0xff),
(byte) (x & 0xff)
};
}
public static DateTime DosDateToDateTime(UInt16 iDate, UInt16 iTime)
{
int year = iDate / 512 + 1980;
@@ -450,33 +280,6 @@ namespace SharpCompress
{
Array.Copy(array, 0, destination, index, array.Length);
}
public static long HostToNetworkOrder(long host)
{
return (int)((long)HostToNetworkOrder((int)host)
& unchecked((long)(unchecked((ulong)-1))) << 32
| ((long)HostToNetworkOrder((int)((int)host >> 32)) & unchecked((long)(unchecked((ulong)-1)))));
}
public static int HostToNetworkOrder(int host)
{
return (int)((int)(HostToNetworkOrder((short)host) & -1) << 16 | (HostToNetworkOrder((short)(host >> 16)) & -1));
}
public static short HostToNetworkOrder(short host)
{
return (short)((int)(host & 255) << 8 | ((int)host >> 8 & 255));
}
public static long NetworkToHostOrder(long network)
{
return HostToNetworkOrder(network);
}
public static int NetworkToHostOrder(int network)
{
return HostToNetworkOrder(network);
}
public static short NetworkToHostOrder(short network)
{
return HostToNetworkOrder(network);
}
#endif
}
}

View File

@@ -11,5 +11,5 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © Adam Hathcock")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("0.11.2.0")]
[assembly: AssemblyFileVersion("0.11.2.0")]
[assembly: AssemblyVersion("0.11.3.0")]
[assembly: AssemblyFileVersion("0.11.3.0")]

View File

@@ -35,7 +35,7 @@ namespace SharpCompress.Writer
{
throw new ArgumentException("Directory does not exist: " + directory);
}
#if NET2
#if NET35
foreach (var file in Directory.GetFiles(directory, searchPattern, option))
#else
foreach (var file in Directory.EnumerateFiles(directory, searchPattern, option))

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Text;
using SharpCompress.Common.Zip;
using SharpCompress.Common.Zip.Headers;
using SharpCompress.Converter;
namespace SharpCompress.Writer.Zip
{
@@ -32,23 +33,23 @@ namespace SharpCompress.Writer.Zip
flags |= HeaderFlags.Bit1; // eos marker
}
}
outputStream.Write(BitConverter.GetBytes((ushort) flags), 0, 2);
outputStream.Write(BitConverter.GetBytes((ushort) compression), 0, 2); // zipping method
outputStream.Write(BitConverter.GetBytes(ModificationTime.DateTimeToDosTime()), 0, 4);
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) flags), 0, 2);
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) compression), 0, 2); // zipping method
outputStream.Write(DataConverter.LittleEndian.GetBytes(ModificationTime.DateTimeToDosTime()), 0, 4);
// zipping date and time
outputStream.Write(BitConverter.GetBytes(Crc), 0, 4); // file CRC
outputStream.Write(BitConverter.GetBytes(Compressed), 0, 4); // compressed file size
outputStream.Write(BitConverter.GetBytes(Decompressed), 0, 4); // uncompressed file size
outputStream.Write(BitConverter.GetBytes((ushort) encodedFilename.Length), 0, 2); // Filename in zip
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // extra length
outputStream.Write(BitConverter.GetBytes((ushort) encodedComment.Length), 0, 2);
outputStream.Write(DataConverter.LittleEndian.GetBytes(Crc), 0, 4); // file CRC
outputStream.Write(DataConverter.LittleEndian.GetBytes(Compressed), 0, 4); // compressed file size
outputStream.Write(DataConverter.LittleEndian.GetBytes(Decompressed), 0, 4); // uncompressed file size
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) encodedFilename.Length), 0, 2); // Filename in zip
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0), 0, 2); // extra length
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) encodedComment.Length), 0, 2);
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // disk=0
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // file type: binary
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // Internal file attributes
outputStream.Write(BitConverter.GetBytes((ushort) 0x8100), 0, 2);
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0), 0, 2); // disk=0
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0), 0, 2); // file type: binary
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0), 0, 2); // Internal file attributes
outputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0x8100), 0, 2);
// External file attributes (normal/readable)
outputStream.Write(BitConverter.GetBytes(HeaderOffset), 0, 4); // Offset of header
outputStream.Write(DataConverter.LittleEndian.GetBytes(HeaderOffset), 0, 4); // Offset of header
outputStream.Write(encodedFilename, 0, encodedFilename.Length);
outputStream.Write(encodedComment, 0, encodedComment.Length);

View File

@@ -10,6 +10,7 @@ using SharpCompress.Compressor.BZip2;
using SharpCompress.Compressor.Deflate;
using SharpCompress.Compressor.LZMA;
using SharpCompress.Compressor.PPMd;
using SharpCompress.Converter;
using SharpCompress.IO;
using DeflateStream = SharpCompress.Compressor.Deflate.DeflateStream;
@@ -74,7 +75,7 @@ namespace SharpCompress.Writer.Zip
var headersize = (uint)WriteHeader(entryPath, modificationTime, compressionInfo);
streamPosition += headersize;
return new ZipWritingStream(this, OutputStream, entry);
return new ZipWritingStream(this, OutputStream, entry, compressionInfo);
}
private string NormalizeFilename(string filename)
@@ -93,7 +94,7 @@ namespace SharpCompress.Writer.Zip
var explicitZipCompressionInfo = compressionInfo != null ? new ZipCompressionInfo(compressionInfo) : this.zipCompressionInfo;
byte[] encodedFilename = ArchiveEncoding.Default.GetBytes(filename);
OutputStream.Write(BitConverter.GetBytes(ZipHeaderFactory.ENTRY_HEADER_BYTES), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes(ZipHeaderFactory.ENTRY_HEADER_BYTES), 0, 4);
if (explicitZipCompressionInfo.Compression == ZipCompressionMethod.Deflate)
{
OutputStream.Write(new byte[] {20, 0}, 0, 2); //older version which is more compatible
@@ -111,14 +112,14 @@ namespace SharpCompress.Writer.Zip
flags |= HeaderFlags.Bit1; // eos marker
}
}
OutputStream.Write(BitConverter.GetBytes((ushort) flags), 0, 2);
OutputStream.Write(BitConverter.GetBytes((ushort)explicitZipCompressionInfo.Compression), 0, 2); // zipping method
OutputStream.Write(BitConverter.GetBytes(modificationTime.DateTimeToDosTime()), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) flags), 0, 2);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort)explicitZipCompressionInfo.Compression), 0, 2); // zipping method
OutputStream.Write(DataConverter.LittleEndian.GetBytes(modificationTime.DateTimeToDosTime()), 0, 4);
// zipping date and time
OutputStream.Write(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 12);
// unused CRC, un/compressed size, updated later
OutputStream.Write(BitConverter.GetBytes((ushort) encodedFilename.Length), 0, 2); // filename length
OutputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // extra length
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) encodedFilename.Length), 0, 2); // filename length
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) 0), 0, 2); // extra length
OutputStream.Write(encodedFilename, 0, encodedFilename.Length);
return 6 + 2 + 2 + 4 + 12 + 2 + 2 + encodedFilename.Length;
@@ -126,9 +127,9 @@ namespace SharpCompress.Writer.Zip
private void WriteFooter(uint crc, uint compressed, uint uncompressed)
{
OutputStream.Write(BitConverter.GetBytes(crc), 0, 4);
OutputStream.Write(BitConverter.GetBytes(compressed), 0, 4);
OutputStream.Write(BitConverter.GetBytes(uncompressed), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes(crc), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes(compressed), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes(uncompressed), 0, 4);
}
private void WriteEndRecord(uint size)
@@ -136,11 +137,11 @@ namespace SharpCompress.Writer.Zip
byte[] encodedComment = ArchiveEncoding.Default.GetBytes(zipComment);
OutputStream.Write(new byte[] {80, 75, 5, 6, 0, 0, 0, 0}, 0, 8);
OutputStream.Write(BitConverter.GetBytes((ushort) entries.Count), 0, 2);
OutputStream.Write(BitConverter.GetBytes((ushort) entries.Count), 0, 2);
OutputStream.Write(BitConverter.GetBytes(size), 0, 4);
OutputStream.Write(BitConverter.GetBytes((uint) streamPosition), 0, 4);
OutputStream.Write(BitConverter.GetBytes((ushort) encodedComment.Length), 0, 2);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) entries.Count), 0, 2);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) entries.Count), 0, 2);
OutputStream.Write(DataConverter.LittleEndian.GetBytes(size), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((uint) streamPosition), 0, 4);
OutputStream.Write(DataConverter.LittleEndian.GetBytes((ushort) encodedComment.Length), 0, 2);
OutputStream.Write(encodedComment, 0, encodedComment.Length);
}
@@ -153,16 +154,18 @@ namespace SharpCompress.Writer.Zip
private readonly Stream originalStream;
private readonly Stream writeStream;
private readonly ZipWriter writer;
private readonly ZipCompressionInfo compressionInfo;
private CountingWritableSubStream counting;
private uint decompressed;
internal ZipWritingStream(ZipWriter writer, Stream originalStream, ZipCentralDirectoryEntry entry)
internal ZipWritingStream(ZipWriter writer, Stream originalStream, ZipCentralDirectoryEntry entry, CompressionInfo compressionInfo)
{
this.writer = writer;
this.originalStream = originalStream;
writeStream = GetWriteStream(originalStream);
this.writer = writer;
this.entry = entry;
this.compressionInfo = compressionInfo == null ? writer.zipCompressionInfo : new ZipCompressionInfo(compressionInfo);
writeStream = GetWriteStream(originalStream);
}
public override bool CanRead
@@ -195,7 +198,7 @@ namespace SharpCompress.Writer.Zip
{
counting = new CountingWritableSubStream(writeStream);
Stream output = counting;
switch (writer.zipCompressionInfo.Compression)
switch (compressionInfo.Compression)
{
case ZipCompressionMethod.None:
{
@@ -203,7 +206,7 @@ namespace SharpCompress.Writer.Zip
}
case ZipCompressionMethod.Deflate:
{
return new DeflateStream(counting, CompressionMode.Compress, writer.zipCompressionInfo.DeflateCompressionLevel,
return new DeflateStream(counting, CompressionMode.Compress, compressionInfo.DeflateCompressionLevel,
true);
}
case ZipCompressionMethod.BZip2:
@@ -229,7 +232,7 @@ namespace SharpCompress.Writer.Zip
}
default:
{
throw new NotSupportedException("CompressionMethod: " + writer.zipCompressionInfo.Compression);
throw new NotSupportedException("CompressionMethod: " + compressionInfo.Compression);
}
}
}
@@ -254,7 +257,7 @@ namespace SharpCompress.Writer.Zip
}
else
{
originalStream.Write(BitConverter.GetBytes(ZipHeaderFactory.POST_DATA_DESCRIPTOR), 0, 4);
originalStream.Write(DataConverter.LittleEndian.GetBytes(ZipHeaderFactory.POST_DATA_DESCRIPTOR), 0, 4);
writer.WriteFooter(entry.Crc, counting.Count, decompressed);
writer.streamPosition += entry.Compressed + 16;
}

Binary file not shown.