From 6a29c0141da58f393a3c8037836c25fd3e0f12a7 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 24 Jan 2025 13:22:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=83=D1=8E=20=D0=BE=D1=80?= =?UTF-8?q?=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20GONEC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/BitBuffer.h | 50 +++++++++++++++++++ Src/BitBuffer.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++ modular.json | 10 ++++ 3 files changed, 188 insertions(+) create mode 100644 Inc/BitBuffer.h create mode 100644 Src/BitBuffer.c create mode 100644 modular.json diff --git a/Inc/BitBuffer.h b/Inc/BitBuffer.h new file mode 100644 index 0000000..8e19d66 --- /dev/null +++ b/Inc/BitBuffer.h @@ -0,0 +1,50 @@ +/* + * BitOps.h + * + * Created on: Apr 13, 2021 + * Author: zemon + */ + +#ifndef BITOPS_INC_BITOPS_H_ +#define BITOPS_INC_BITOPS_H_ + +#include "stdint.h" + + +void vBitBufferAppendDataByteBitsCountWithBitsOffset( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t appendableByte, + uint8_t countOfAppendableBits +); + +uint8_t vBitBufferAppendByte( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t appendableByte, + uint8_t countOfAppendableBits +); + +uint8_t vBitBufferAppendBits( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBits +); + +uint8_t vBitBufferAppendBitsReverseBytes( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBits +); + +uint8_t vBitBufferAppendBytesReverse( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBytes +); + + +#endif /* BITOPS_INC_BITOPS_H_ */ diff --git a/Src/BitBuffer.c b/Src/BitBuffer.c new file mode 100644 index 0000000..02f9388 --- /dev/null +++ b/Src/BitBuffer.c @@ -0,0 +1,128 @@ +/* + * BitOps.c + * + * Created on: Apr 13, 2021 + * Author: zemon + */ +#include "BitBuffer.h" + + +void vBitBufferAppendDataByteBitsCountWithBitsOffset( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t appendableByte, + uint8_t countOfAppendableBits +) { + + uint16_t fullBytesOffset = offsetOfFirstBit / 8; + uint8_t bitsOffsetInFirstByte = offsetOfFirstBit % 8; + uint8_t bitsWritedToSecondByte = bitsOffsetInFirstByte + countOfAppendableBits - 8; + + uint8_t firstByteCut = appendableByte << (8 - countOfAppendableBits); + + destinationBitSequence[fullBytesOffset] |= firstByteCut >> bitsOffsetInFirstByte; + + if (bitsWritedToSecondByte > 0) { + destinationBitSequence[fullBytesOffset + 1] |= appendableByte << (8 - bitsWritedToSecondByte); + } +} + +uint8_t vBitBufferAppendByte( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t appendableByte, + uint8_t countOfAppendableBits +) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableByte, + countOfAppendableBits + ); + return countOfAppendableBits; +} + + +uint8_t vBitBufferAppendBits( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBits +) { + + uint16_t fullBytes = countOfAppendableBits / 8; + uint16_t notFullByteBits = countOfAppendableBits % 8; + + uint16_t i = 0; + for (; i < fullBytes; ++i) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableData[i], 8 + ); + offsetOfFirstBit += 8; + } + + if (notFullByteBits > 0) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableData[i], + notFullByteBits + ); + } + return countOfAppendableBits; +} + +uint8_t vBitBufferAppendBitsReverseBytes( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBits +) { + + uint16_t fullBytes = countOfAppendableBits / 8; + uint16_t notFullByteBits = countOfAppendableBits % 8; + + uint16_t totalBytes = fullBytes + (notFullByteBits > 0 ? 1 : 0); + + uint16_t i = 0; + for (; i < fullBytes; ++i) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableData[(totalBytes - 1) - i], + 8 + ); + offsetOfFirstBit += 8; + } + + if (notFullByteBits > 0) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableData[(totalBytes - 1) - i], + notFullByteBits + ); + } + return countOfAppendableBits; +} + +uint8_t vBitBufferAppendBytesReverse( + uint8_t *destinationBitSequence, + uint16_t offsetOfFirstBit, + uint8_t *appendableData, + uint8_t countOfAppendableBytes +) { + for (int i = countOfAppendableBytes - 1; i > -1; --i) { + vBitBufferAppendDataByteBitsCountWithBitsOffset( + destinationBitSequence, + offsetOfFirstBit, + appendableData[i], 8 + ); + offsetOfFirstBit += 8; + } + + return countOfAppendableBytes * 8; +} + diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..71971cd --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file