1 // ByteSwap.cpp 2 3 #include "StdAfx.h" 4 5 #include "../../Common/MyCom.h" 6 7 #include "../ICoder.h" 8 9 #include "../Common/RegisterCodec.h" 10 11 namespace NCompress { 12 namespace NByteSwap { 13 14 class CByteSwap2: 15 public ICompressFilter, 16 public CMyUnknownImp 17 { 18 public: 19 MY_UNKNOWN_IMP1(ICompressFilter); 20 INTERFACE_ICompressFilter(;) 21 }; 22 23 class CByteSwap4: 24 public ICompressFilter, 25 public CMyUnknownImp 26 { 27 public: 28 MY_UNKNOWN_IMP1(ICompressFilter); 29 INTERFACE_ICompressFilter(;) 30 }; 31 32 STDMETHODIMP CByteSwap2::Init() { return S_OK; } 33 34 STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size) 35 { 36 const UInt32 kStep = 2; 37 if (size < kStep) 38 return 0; 39 size &= ~(kStep - 1); 40 41 const Byte *end = data + (size_t)size; 42 43 do 44 { 45 Byte b0 = data[0]; 46 data[0] = data[1]; 47 data[1] = b0; 48 data += kStep; 49 } 50 while (data != end); 51 52 return size; 53 } 54 55 STDMETHODIMP CByteSwap4::Init() { return S_OK; } 56 57 STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size) 58 { 59 const UInt32 kStep = 4; 60 if (size < kStep) 61 return 0; 62 size &= ~(kStep - 1); 63 64 const Byte *end = data + (size_t)size; 65 66 do 67 { 68 Byte b0 = data[0]; 69 Byte b1 = data[1]; 70 data[0] = data[3]; 71 data[1] = data[2]; 72 data[2] = b1; 73 data[3] = b0; 74 data += kStep; 75 } 76 while (data != end); 77 78 return size; 79 } 80 81 REGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2()) 82 REGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4()) 83 84 REGISTER_CODECS_VAR 85 { 86 REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"), 87 REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4") 88 }; 89 90 REGISTER_CODECS(ByteSwap) 91 92 }} 93