27 Eylül 2017 Çarşamba

Gömülü Proje - BitStream

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
A bit mask is used to mask some bits of a bit field while exposing others.
initial value: 011011001
bit mask.....: 111110000
result value.: 011010000

MASK'lar şöyledir
const unsigned int MASKS      [] = {0,           //0
                                                        0x1,      //1
                                                        0x3,      //2
                                                        0x7,      //3
                                                        0xf,       //4
                                                        0x1f,     //5
                                                        0x3f,     //6
                                                        0x7f,     //7
                                                        0xff,      //8
                                                       }
Header
Şöyle yaparız.
class BitStream {
  uint32_t m_BitPosition;
  uint32_t m_BytePosition;
  uint8_t* m_pBuffer;
  uint32_t m_SizeInBytes;
}
Constructor
Şöyle yaparız.
BitStream(uint8_t* pBuffer,uint32_t sizeInBytes){
  m_BitPosition      = 0;
  m_ BytePosition = 0;
  m_pBuffer            = pBuffer;
  m_SizeInBytes     = sizeInBytes;
}
setPosition metodu
Şöyle yaparız.
void setPosition (uint32_t bitPosition){
  m_BytePosition = bitPosition /  8;
  m_BitPosition = bitPosition % 8;
}
read metodu
Şö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){
  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;
      //1
      uint8_t buf = ((MASKS [bitsToRead] << m_BitPosition) & m_pBuffer [m_BytePosition]) >> m_BitPosition;

      if (nextByte){
        m_BytePosition ++;
        m_BitPosition = 0;

      }
      else {
        m_BitPosition +=   bitsToRead;
      }
    //2
    result |= (buf << bitsRead);
    bitsRead += bitsToRead;
  } //while
  return result;
}
write metodu
Şö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;
    //1
    m_pBuffer [m_BytePosition] &= ~(data & (MASKS [bitsToWrite] << m_BitPosition);
    //2
    m_pBuffer [m_BytePosition] |= (data & (MASKS [bitsToWrite] << m_BitPosition);

    if (nextByte){
      m_BytePosition ++;
      m_BitPosition = 0;
    }
    else {
      m_BitPosition +=   bitsToWrite;
    }
    //3
    data = (data >> bitsToWrite);
  }

};





Hiç yorum yok:

Yorum Gönder