Giriş
Bu sınıfı sağdan sola doğru okuma ve yazma işlemi yapar. Çok nadiren de olsa soldan sağa doğru kullanılan BitStream sınıfları da gördüm.
Bit Mask
Açıklaması şöyle
Bu sınıfı sağdan sola doğru okuma ve yazma işlemi yapar. Çok nadiren de olsa soldan sağa doğru kullanılan BitStream sınıfları da gördüm.
Bit Mask
Açıklaması şöyle
A bit mask is used to mask some bits of a bit field while exposing others.MASK'lar şöyledir
initial value: 011011001
bit mask.....: 111110000
result value.: 011010000
const unsigned int MASKS [] = {0, //00x1, //10x3, //20x7, //30xf, //40x1f, //50x3f, //60x7f, //70xff, //8}
Header
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız. Bu metod içinde buffer overflow kontrolü yok ancak kolaylıkla yapılabilir.
//1 ile işaretli yerde mask zaten okunmuş bit sayısı kadar kaydırılır. Böylece doğru mask elde edilir. Buffer'dan istenilen bit sayısı okunduktan sonra elde edilen değer tekrar sağa kaydırılır.
//2 ile işaretli yerde okunan değer toplam okunan bit sayısı kadar kaydırılı ve sonuca dahil edilir.
Şöyle yaparız. Bu metod içinde buffer overflow kontrolü yok ancak kolaylıkla yapılabilir.
//1 ile işaretli yerde buffer'daki alan temizlenir
//2 ile işaretli yerde data yazılır
//3 ile işaretli yerde data'nın yazılan bitleri atılır.
Şöyle yaparız.
class BitStream {Constructor
uint32_t m_BitPosition;
uint32_t m_BytePosition;
uint8_t* m_pBuffer;
uint32_t m_SizeInBytes;
}
Şöyle yaparız.
BitStream(uint8_t* pBuffer,uint32_t sizeInBytes){setPosition metodu
m_BitPosition = 0;m_ BytePosition = 0;m_pBuffer = pBuffer;m_SizeInBytes = sizeInBytes;}
Şöyle yaparız.
void setPosition (uint32_t bitPosition){read metodu
m_BytePosition = bitPosition / 8;m_BitPosition = bitPosition % 8;}
Şöyle yaparız. Bu metod içinde buffer overflow kontrolü yok ancak kolaylıkla yapılabilir.
//1 ile işaretli yerde mask zaten okunmuş bit sayısı kadar kaydırılır. Böylece doğru mask elde edilir. Buffer'dan istenilen bit sayısı okunduktan sonra elde edilen değer tekrar sağa kaydırılır.
//2 ile işaretli yerde okunan değer toplam okunan bit sayısı kadar kaydırılı ve sonuca dahil edilir.
uint32_t read (uint8_t numberOfBits){write metodu
uint32_t result = 0;
uint8_t bitsRead = 0;
while (numberOfBits > 0) {
uint8_t bitsToRead = numberOfBits;
bool nextByte = false;
if (numberOfBits + m_BitPosition) > 8) {
bitsToRead = 8 - m_BitPosition;nextWord = true;
}numberOfBits -= bitsToRead;//1uint8_t buf = ((MASKS [bitsToRead] << m_BitPosition) & m_pBuffer [m_BytePosition]) >> m_BitPosition;
if (nextByte){
m_BytePosition ++;m_BitPosition = 0;}else {
m_BitPosition += bitsToRead;}//2result |= (buf << bitsRead);bitsRead += bitsToRead;} //whilereturn result;
}
Şöyle yaparız. Bu metod içinde buffer overflow kontrolü yok ancak kolaylıkla yapılabilir.
//1 ile işaretli yerde buffer'daki alan temizlenir
//2 ile işaretli yerde data yazılır
//3 ile işaretli yerde data'nın yazılan bitleri atılır.
void write (uint32_t data, uint8_t numberOfBits){
while (numberOfBits > 0) {
uint8_t bitsToWrite = numberOfBits;
bool nextByte = false;
if (numberOfBits + m_BitPosition) >= 8) {
bitsToWrite = 8 - m_BitPosition;nextByte = true;
}numberOfBits -= bitsToWrite;//1m_pBuffer [m_BytePosition] &= ~(data & (MASKS [bitsToWrite] << m_BitPosition);//2m_pBuffer [m_BytePosition] |= (data & (MASKS [bitsToWrite] << m_BitPosition);if (nextByte){
m_BytePosition ++;m_BitPosition = 0;}else {
m_BitPosition += bitsToWrite;}//3data = (data >> bitsToWrite);}};
Hiç yorum yok:
Yorum Gönder