diff --git a/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate b/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate index 1e3e6102629ef05b3b5d41b0f80b0cef00d24949..6602ccb9c7d74c6ae7445b5d225517b10b5918c6 100644 Binary files a/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate and b/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/include/ByteStream.h b/include/ByteStream.h index af2597398e32449a31c320e0504512acf1ac9ad5..d44f232ab3bb9757c04832c4763dc1af768b29bb 100644 --- a/include/ByteStream.h +++ b/include/ByteStream.h @@ -119,6 +119,20 @@ public: /// \param dim number of byte (1 or 2) long getValue(dword start, word dim); + /// Create a copy of the stream with some additional padding. The stream is divided into chunks + /// with numberOfChunks = size() / chunkSize. + /// \param chunkSize the size of a chunk without padding. + /// \param padSize Size of the padding. + /// \return The padded copy of this byte stream. + ByteStreamPtr getPaddedCopy(dword chunkSize, dword padSize); + + /// Create a copy of the stream removing some padding. The stream is divided into chunks + /// with numberOfChunks = size() / chunkSize. + /// \param chunkSize the size of a chunk with padding. + /// \param padSize Size of the padding. + /// \return The unpadded copy of this byte stream. + ByteStreamPtr getUnpaddedCopy(dword chunkSize, dword padSize); + char* printStreamInHexadecimal(); /// Get type of allocations. diff --git a/src/ByteStream.cpp b/src/ByteStream.cpp index 95ab024795e8a06e45a99476d0fad046b853cb13..717a9af242ad9d9cfaf35913a6c817b1039f3a90 100644 --- a/src/ByteStream.cpp +++ b/src/ByteStream.cpp @@ -496,6 +496,42 @@ void PacketLib::ByteStream::deleteStreamMemory() delete[] stream; } +ByteStreamPtr PacketLib::ByteStream::getPaddedCopy(dword chunkSize, dword padSize) +{ + if(byteInTheStream % chunkSize != 0) + throw new PacketException("getPadCopy() error. Chunk size must be a divisor of ByteStream::size()."); + + dword nChunks = byteInTheStream / chunkSize; + dword newChunkSize = chunkSize + padSize; + + ByteStreamPtr sPtr = ByteStreamPtr(new ByteStream(nChunks*(newChunkSize), bigendian)); + byte* raw = sPtr->getStream(); + + for(dword i=0; i<nChunks; i++) + memcpy(raw+i*newChunkSize, stream+i*chunkSize, chunkSize); + + return sPtr; +} + +ByteStreamPtr PacketLib::ByteStream::getUnpaddedCopy(dword chunkSize, dword padSize) +{ + if(byteInTheStream % chunkSize != 0) + throw new PacketException("getUnpadCopy() error. Chunk size must be a divisor of ByteStream::size()."); + if(chunkSize - padSize <= 0) + throw new PacketException("getUnpadCopy() error. Chunk size - pad size gives a value <= 0."); + + dword nChunks = byteInTheStream / chunkSize; + dword newChunkSize = chunkSize - padSize; + + ByteStreamPtr sPtr = ByteStreamPtr(new ByteStream(nChunks*(newChunkSize), bigendian)); + byte* raw = sPtr->getStream(); + + for(dword i=0; i<nChunks; i++) + memcpy(raw+i*newChunkSize, stream+i*chunkSize, newChunkSize); + + return sPtr; +} + void PacketLib::ByteStream::swapWord() { dword dim = byteInTheStream; for(dword i = 0; i< dim; i+=2)