diff --git a/include/ByteStream.h b/include/ByteStream.h index 5d4b43615f8ca63c1cd5e83d1df68e6bb87c2b60..f8de93ab5037a371dd098931f304897ca7779d53 100644 --- a/include/ByteStream.h +++ b/include/ByteStream.h @@ -107,6 +107,20 @@ public: /// Gets the dimension of the stream dword size(); + /// 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)