#pragma once #if SUN_CODE_BACKUP //============================================================================================================================= /// BitStreamEx class /** @author Lee Eun-pa @since 2006. 11. 12 @remark - BitStream ÀÇ Pack & Unpack °ü·Ã °³¼± ¹æ¾È @note - Metadata¸¦ ÀÌ¿ëÇÑ Á»´õ È®À强 ÀÖ°í À¯¿¬ÇÑ ±¸Á¶¸¦ ¸¸µç´Ù. @history - */ //============================================================================================================================= #include "BitStream.hpp" #pragma pack( push, 1 ) struct sPACK_BIT_METAINFO { BYTE BIT_SIZE; BYTE USED_BITS; }; #define METANODE_4PACK( TypeName, UsedBits ) \ { BYTES_TO_BITS(sizeof(TypeName)), UsedBits } #define METANODE_4PACK_EOR() \ { 0, 0 } // sPACK_BIT_METAINFO ÀڷᱸÁ¶ Á¤ÀÇ (¿¹Á¦) // // const sPACK_BIT_METAINFO c_PACK_METAINFO = // { // METANODE_4PACK( BYTE, 3 ), // METANODE_4PACK( DWORD, 9 ), // METANODE_4PACK( WORD, 7 ), // METANODE_4PACK( BOOL, 1 ), // METANODE_4PACK( DWORD, 30 ), // METANODE_4PACK_EOR() // }; // // ´ÙÀ½Àº ÀÌ·¯ÇÑ ¸ÞŸÁ¤º¸¸¦ ÃßÃâÇÑ ¿øº» ±¸Á¶Ã¼¸¦ º¸ÀδÙ. // #pragma pack( push, 1 ) // struct sSOURCE_STRUCT s_SOURCE_STRUCT = // { // BYTE m_byField1; // DWORD m_dwField2; // WORD m_wField3; // BOOL m_bField4; // DWORD m_dwField5; // }; // #pragma pack( pop ) // // ÆÐÅ·µÇ´Â Á¤º¸´Â BYTEÀÇ ¹è¿­·Î ÃæºÐÇÒ µí. // // // ¸¸¾à ´ÙÀ½°ú °°Àº ±¸Á¶°¡ Á¤ÀǵǾî ÀÖÀ» °æ¿ì (#pragma packµÇÁö ¾ÊÀº ±¸Á¶Ã¼) // // struct sSOURCE_STRUCT s_SOURCE_STRUCT2 = // { // BYTE m_byField1; // DWORD m_dwField2; // WORD m_wField3; // BOOL m_bField4; // DWORD m_dwField5; // }; // // À̰ÍÀÇ ¸ÞŸÁ¤º¸´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù. // const sPACK_BIT_METAINFO c_PACK_METAINFO2 = // { // METANODE_4PACK( BYTE, 3 ), // METANODE_4PACK( BYTE, 0 ), // METANODE_4PACK( BYTE, 0 ), // METANODE_4PACK( BYTE, 0 ), // METANODE_4PACK( DWORD, 9 ), // METANODE_4PACK( WORD, 7 ), // METANODE_4PACK( WORD, 0 ), // METANODE_4PACK( BOOL, 1 ), // METANODE_4PACK( DWORD, 30 ), // METANODE_4PACK_EOR() // }; // // // <»ç¿ë ¿¹Á¦> // ---------------------------------------------------- // bitStream.SetMetaInfo( c_PACK_METAINFO ); // ---------------------------------------------------- // bitStream.Pack( (BYTE*)&s_SOURCE_STRUCT ); // int readed = bitStream.GetNumberOfBitsUsed(); // bitStream.SetReadOffSet( 0 ); // bitStream.UnPack( (BYTE*)&s_SOURCE_STRUCT, sizeof(s_SOURCE_STRUCT) ); // // <È®Àå ¹æ¾È> // bitStream.SetMetaInfo( c_PACK_METAINFO ); // bitStream.Pack( (BYTE*)&s_SOURCE_STRUCT ); // int readed = bitStream.GetNumberOfBitsUsed(); // bitStream.SetReadOffSet( 0 ); // ---------------------------------------------------- // bitStream.SetMetaInfo( c_PACK_METAINFO2 ); // ---------------------------------------------------- // bitStream.UnPack( (BYTE*)&s_SOURCE_STRUCT2, sizeof(s_SOURCE_STRUCT2) ); // // -> °á°ú´Â <»ç¿ë ¿¹Á¦>¿Í °°Áö¸¸, s_SOURCE_STRUCT2ÀÇ ½ÇÁ¦ ±¸Á¶ ¼öÁ¤À» ÅëÇØ »ç¿ëµÇÁö ¾Ê´ø ºÎºÐÀ» »ç¿ëÇÒ // ¼ö ÀÖ°Ô µÈ´Ù. // -> ¶Ç´Â ¾Æ¿¹, ±âÁ¸ Å©±â¸¦ ¹þ¾î³ª´Â °ø°£À» »ðÀÔÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. // -> ÀÏ´Ü ´ÙÀ½°ú °°ÀÌ // METANODE_4PACK( DWORD, 0 ), // ÇϳªÀÇ Çʵ带 Áß°£¿¡ »ðÀÔÇØ µÎ¸é, ±âÁ¸ ÀÛ¾÷Àº ±× °ø°£À» °Ç³Ê¶Ú ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ°í, ³ªÁß¿¡ // »ç¿ë ºñÆ® ¼ö¸¦ ÀÔ·ÂÇϰí ÀÌ¿¡ ´ëÇÑ µ¥ÀÌÅ͸¦ ÁغñÇϸé, È®ÀåµÈ °ø°£ÀÌ »ý°Ü³¯ °ÍÀÌ´Ù. // // ¿¹) ƯÁ¤ ±¸Á¶Ã¼¿¡ ¹öÀü¿¡ µû¶ó ´Ù¸¥ 󸮸¦ ÇÏ°Ô ÇÏ°í ½Í´Ù. ÇÏÁö¸¸ ±âÁ¸¿¡´Â ¹öÀü Á¤º¸°¡ ¾ø´Â ±¸Á¶Ã¼¿´´Ù. // 1. À§¿Í °°ÀÌ Çʵå Çϳª¸¦ Ãß°¡ÇÑ´Ù. METANODE_4PACK( BYTE, 0 ), // ¹öÀü Á¤º¸ // 2. PackedData¸¦ Unpack½ÃÄÑ Ãß°¡µÈ ¸ÞŸÁ¤º¸°¡ Àû¿ëµÈ ±¸Á¶Ã¼·Î ÀоîµéÀδÙ. // 3. »õ·Î¿î ±¸Á¶Ã¼¿¡´Â ¹öÀü¿ë °ø°£ÀÎ BYTE°¡ °Ç³Ê¶Ù°í Á¤º¸°¡ ´ã±æ °ÍÀÌ´Ù. // 4. ¸ÞŸÁ¤º¸ÀÇ ¼öÁ¤: METANODE_4PACK( BYTE, 4 ) // ¹öÀü Á¤º¸, ¿©±â¼­´Â 4ºñÆ®·Î ó¸®ÇÑ´Ù. // 5. ¹öÀü Á¤º¸¸¦ »ðÀÔÇÑ´Ù. // 6. ´Ù½Ã PackÇÑ´Ù. // 7. PackµÈ Á¤º¸´Â ¹öÀü °ø°£ÀÌ °¨¾ÈµÈ »õ·Î¿î µ¥ÀÌÅͰ¡ µÉ °ÍÀÌ´Ù. // #pragma pack( pop ) // // class BitStreamEx // class BitStreamEx : public BitStream { public: BitStreamEx( BYTE* IN OUT pStorage, WORD wCountOfBytes, const sPACK_BIT_METAINFO* IN pMetaInfo ) : BitStream( pStorage, wCountOfBytes, TRUE ), m_pMetaInfo( (sPACK_BIT_METAINFO*)pMetaInfo ) {} ~BitStreamEx() {} public: // inline VOID SetMetaInfo( const sPACK_BIT_METAINFO* IN pMetaInfo ) { m_pMetaInfo = (sPACK_BIT_METAINFO*)pMetaInfo; //DWORD dwByteCount = GetBytesByMetaInfo(); } // // // // pPackingStorage : BYTE* =-> MetaInfo¸¦ ÀÌ¿ëÇØ PackingÇÒ Á¤º¸ // wUsedBytes : WORD& =-> »ç¿ëµÈ byte ±æÀ̰¡ µÉ °ÍÀÌ´Ù. // VOID Pack( BYTE* IN pPackingStorage ) { sPACK_BIT_METAINFO* pMETA = m_pMetaInfo; BYTE* pSrc = (BYTE*)pPackingStorage; DWORD dwByteCount = 0; DWORD dwBitCount; while( dwBitCount = (DWORD)pMETA->BIT_SIZE ) { DWORD dwBitRange = (DWORD)pMETA->USED_BITS; if( dwBitRange ) { BYTE* pSrcPtr = &pSrc[dwByteCount]; Write( pSrcPtr, dwBitRange ); } dwByteCount += dwBitCount>>3; ++pMETA; } } // // // // pUnpackingStorage : BYTE* =-> MetaInfo¸¦ ÀÌ¿ëÇØ PackingµÈ Á¤º¸¸¦ UnPackÇÏ´Â °ø°£ // bTF : BOOL =-> pUnpackingStorageÀ» ÃʱâÈ­ ÇÒ °ÍÀÎÁöÀÇ ¿©ºÎ, // VOID UnPack( BYTE* OUT pUnpackingStorage, WORD wTypeSize, BOOL bTF = TRUE ) { if( bTF ) memset( pUnpackingStorage, 0, wTypeSize ); sPACK_BIT_METAINFO* pMETA = m_pMetaInfo; BYTE* pTarget = (BYTE*)pUnpackingStorage; DWORD dwByteCount = 0; DWORD dwBitOffset = 0; DWORD dwBitCount; while( dwBitCount = pMETA->BIT_SIZE ) { DWORD dwBitRange = (DWORD)pMETA->USED_BITS; if( dwBitRange ) { BYTE* pTargetPtr = &pTarget[dwByteCount]; Read( pTargetPtr, dwBitRange ); } dwByteCount += dwBitCount>>3; ++pMETA; } } // ¾Æ·¡¿Í °°Àº ±â´Éµµ µÉ °ÍÀÌ´Ù. ÇÏÁö¸¸ º¯È¯ Åø¿¡¼­³ª À¯¿ëÇÑ °ÍÀ̹ǷΠ±¸ÇöÇÏÁö ¾Ê±â·Î ÇÑ´Ù. //VOID ConvertPacked( BYTE* OUT pUnpackingStorage, const sPACK_BIT_METAINFO* pConvertMetaInfo ); //VOID ConvertUnPacked( BYTE* OUT pUnpackingStorage, const sPACK_BIT_METAINFO* pConvertMetaInfo ); DWORD GetBytesByMetaInfo( const sPACK_BIT_METAINFO* pMetaInfo = NULL ) { sPACK_BIT_METAINFO* pMETA; pMETA = pMetaInfo ? pMetaInfo : m_pMetaInfo; DWORD dwBitCount; DWORD dwBitSum = 0; while( dwBitCount = pMETA->BIT_SIZE ) { DWORD dwBitRange = (DWORD)pMETA->USED_BITS; dwBitSum += dwBitRange; } DWORD dwByteCount = BITS_TO_BYTES(dwBitSum); return dwByteCount; } private: sPACK_BIT_METAINFO* m_pMetaInfo; }; #endif //SUN_CODE_BACKUP