Từ 1 tới 1 trên tổng số 1 kết quả

Đề tài: Mã nguồn ghi bit data vào stream

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    398

    Mặc định Mã nguồn ghi bit data vào stream

    Mã nguồn mới code, mời các bạn xem và cho ý kiến
    Tác dụng: ghi bit data vào stream cài đặt bằng list
    BitStream.h
    C++ Code:
    1. #include <list>
    2. #include <math.h>
    3. #include <iostream>
    4. #include <string>
    5. using namespace std;
    6.  
    7. namespace PvKhoa
    8. {
    9.     enum BitsAlign{BitsRight,BitsLeft};
    10.     class BitWriter
    11.     {
    12.     private:
    13.         list<char> *iData;
    14.         char iChar;//
    15.         unsigned char iBitsLeft;
    16.         BitsAlign iBitsAlign;
    17.     public:
    18.         BitWriter(list<char> *rData, BitsAlign rBitsAlign);
    19.         void WriteBits(char, unsigned char);
    20.         void WriteBits(char*,unsigned char,unsigned char);
    21.         void WriteChars(char*, unsigned char);
    22.         void EndWriteBits();
    23.         void EchoBits();
    24.         string CharToBin(char);
    25.         string CharToBin(char,unsigned char);
    26.     };
    27. }
    BitStream.cpp
    C++ Code:
    1. #include "BitStream.h"
    2. using namespace PvKhoa;
    3.  
    4. BitWriter::BitWriter(list<char> *rData,BitsAlign)
    5. {
    6.     iBitsAlign=BitsAlign::BitsRight;
    7.     iData=rData;
    8.     iChar=0;
    9.     iBitsLeft=8;
    10. }
    11. //ghi rBitCount bit từ rChar vào list
    12. void BitWriter::WriteBits(char rChar, unsigned char rBitCount)
    13. {
    14.     unsigned char vInputBitsLeft;
    15.     unsigned char vBitsMin;
    16.     unsigned short vBits;
    17.     if(iBitsAlign==BitsAlign::BitsRight)
    18.     {
    19.         if(rBitCount>8) rBitCount=8;
    20.         vInputBitsLeft=rBitCount;
    21.         //cắt bỏ bit thừa còn đúng rBitCount bit
    22.         rChar=rChar&((int)pow(2,rBitCount)-1);
    23.         while(vInputBitsLeft>0)//vẫn còn bit trong rChar chưa được ghi hết
    24.         {
    25.             vBitsMin=min(iBitsLeft,vInputBitsLeft);
    26.             //ghi bit từ rChar vào iChar
    27.             vBits=rChar>>(rBitCount-vInputBitsLeft);
    28.             vBits=vBits<<(8-iBitsLeft);
    29.             iChar=iChar|vBits;
    30.  
    31.             //cập nhật số bit chưa được ghi của rChar và số bit còn trống của iChar
    32.             iBitsLeft-=vBitsMin;
    33.             vInputBitsLeft-=vBitsMin;
    34.  
    35.             if(iBitsLeft==0)//byte iChar đã đầy đủ 8 bit
    36.             {
    37.                 iData->push_back(iChar);//đẩy iChar vào list
    38.                 iChar=0;
    39.                 iBitsLeft=8;
    40.             }
    41.             //nếu iChar vẫn chưa đủ 8 bit, phần bit còn lại của rChar đã chuyển hết vào và lưu trong iChar, phần bit này chưa được đẩy vào list, đợi đến lần writebits sau hoặc sau nữa...
    42.         }
    43.         cout.width(20);
    44.         cout<<CharToBin(rChar,rBitCount);
    45.         EchoBits();
    46.     }
    47.     else if(iBitsAlign==BitsAlign::BitsLeft)
    48.     {
    49.  
    50.     }
    51. }
    52. //ghi rBitCount bit từ rChars* vào list, canh bên phải BitsRight align
    53. void BitWriter::WriteBits(char *rChars, unsigned char rByteCount, unsigned char rBitCount)
    54. {
    55.     if(rBitCount>rByteCount *8)
    56.     {
    57.         rBitCount=rByteCount*8;
    58.     }
    59.     if(iBitsAlign==BitsAlign::BitsRight)
    60.     {
    61.         while(rBitCount>8)
    62.         {
    63.             WriteBits(rChars[rByteCount-1],8);
    64.             rByteCount--;
    65.             rBitCount-=8;
    66.         }
    67.         WriteBits(rChars[rByteCount-1],rBitCount);
    68.         //EchoBits();
    69.     }
    70. }
    71. void BitWriter::EndWriteBits()
    72. {
    73.     if(iBitsLeft<8)//iBitsLeft <= 0 là không xảy ra
    74.     {
    75.         iData->push_back(iChar);//đẩy iChar vào list, bỏ qua phần bit còn trống
    76.         iChar=0;
    77.         iBitsLeft=8;
    78.     }
    79. }
    80. //ghi mảng char vào list
    81. void BitWriter::WriteChars(char* rChar,unsigned char rByteCount)
    82. {
    83.     EndWriteBits();//đẩy hết iChar vào list để chuyển sang chế độ ghi bytes
    84.     iData->insert(iData->end(),rChar,rChar+rByteCount);
    85. }
    86. string BitWriter::CharToBin(char rChar,unsigned char rBitCount)
    87. {
    88.     string vStr="";
    89.     char vBit;
    90.     for(int vi=rBitCount-1;vi>=0;vi--)
    91.     {
    92.         vBit=1<<vi;
    93.         if((rChar&vBit)==vBit)
    94.         {
    95.             vStr+="1";
    96.         }
    97.         else
    98.         {
    99.             vStr+="0";
    100.         }
    101.     }
    102.     return vStr;
    103. }
    104. string BitWriter::CharToBin(char rChar)
    105. {
    106.     return CharToBin(rChar,8);
    107. }
    108. void BitWriter::EchoBits()
    109. {
    110.     string vStr="";
    111.     list<char>::iterator it=iData->begin();
    112.     string vStr2;
    113.     for(int vi=0;vi<iData->size();vi++)
    114.     {
    115.         vStr2=CharToBin(*it);
    116.         vStr=vStr2+vStr;
    117.         it++;
    118.     }
    119.     if(iBitsLeft<8)
    120.     {
    121.         vStr2=CharToBin(iChar,8-iBitsLeft);
    122.         vStr=vStr2+vStr;
    123.     }
    124.     cout.width(50);
    125.     cout<<vStr<<"\n";
    126. }
    Program.cpp
    C++ Code:
    1. #include "BitStream.h"
    2. using namespace PvKhoa;
    3.  
    4. int main()
    5. {
    6.     list<char> *vData=new list<char>();
    7.     BitWriter vBitWriter(vData,BitsAlign::BitsRight);
    8.     vBitWriter.WriteBits(1,2);
    9.     vBitWriter.WriteBits(4,5);
    10.     char vChar[]={0xFF,0x0F};
    11.     vBitWriter.WriteBits(vChar,2,13);
    12.     vBitWriter.WriteBits(128,8);
    13.         long vLong=0xFEFE;
    14.         vBitWriter.WriteBits((char*)&vLong,sizeof(long),13);
    15.         EndWriteBits();
    16.     getchar();
    17. }
    code chạy đúng nhưng như vậy đã ổn chưa?
    các byte được viết ra từ phải sang trái
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		BitWriter.png
Lần xem:	2
Size:		67.4 KB
ID:		61367
    Đã được chỉnh sửa lần cuối bởi khoaph : 25-04-2018 lúc 07:32 PM.

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn