사용자 삽입 이미지



CRC에 대한 라이브러리와 예제코드를 한번 만들어 올려본다.

이걸 만들게 된 동기는 인터넷 검색하다가 진짜로 시원하게 제대로 된 CRC라이브러리도 없고 예제코드도 없는거 같다는 느낌이 팍팍 들어서 만들게 됐다. 은근히 인터넷에 공개된 소스중에 결과값이 일치하는게 별로 없었다. (ㅋㅋ 그중에서 내가 옛날에 만들었던 예제코드도 있더군 ㅡㅡ;)

그래서 CRC16 / CRC32 / CRC64 에 대한 제대로된 라이브러리 한번 만들어 본답시고 만들어 봤다.

초보프로그래머라면 한번쯤 겪어야 할만한 소재로 CRC구현이 있을거다. 이제는 걱정말자. 그냥 이거 가져다가 마음껏 응용해서 사용하시길~~~ 이 Library source의 장점은 조금의 노력으로 보다 다양한 CRC polynomial을 적용하여 확장시킬수 있도록 되어 있다는 부분이다. 즉, CRC128같은 경우도 가능하며 CRC8도 가능하다. CRC24는 조금은 무리수가 있지만...

생각보다 구현원칙에 입각하려다 보니까 좀 복잡해진 느낌이 있지만 결코 성능적인 부분이나 크기부분에서 다른 코드들보다 크게 떨어지지 않을것이다. 어쨌건 나중에 더 최적화하기로 하고....



2009년 2월 17일 현재기준 소스는  이것이고...



최근소스는 http://source.hwport.com/viewvc/opensource/mzcrc/ 에서 찾아볼수 있다.








/*
Copyright (C) JAEHYUK CHO
All rights reserved.

Author: JaeHyuk Cho <minzkn@minzkn.com>
*/


#if !defined(__HEADER_MZCRC_H__)
#define __HEADER_MZCRC_H__ "mzcrc.h"

#include <stdlib.h>

/* ---- C/C++ export/import macro */

#if defined(__cplusplus)
# if !defined(def_mz_import_c)
define def_mz_import_c                                            extern "C"
# endif
# if !defined(def_mz_export_c)
define def_mz_export_c                                            extern "C"
# endif
#else
# if !defined(def_mz_import_c)
define def_mz_import_c                                            extern
# endif
# if !defined(def_mz_export_c)
define def_mz_export_c
# endif
#endif

/* ---- Built-in expect macro */

#if defined(__GNUC__)
# define mz_builtin_expect(m_expression,m_value)                     __builtin_expect((long)(m_expression),(long)(m_value))
#else
# define mz_builtin_expect(m_expression,m_value)                     m_expression
#endif

/* ---- System type define */

#if !defined(mz_uint8_t)
# define __mz_uint8_t                                                unsigned char
# define mz_uint8_t                                                  __mz_uint8_t
# define mz_uint8_const(m_value)                                     ((__mz_uint8_t)(m_value##u))
#endif

#if !defined(mz_uint16_t)
# define __mz_uint16_t                                               unsigned short
# define mz_uint16_t                                                 __mz_uint16_t
# define mz_uint16_const(m_value)                                    ((__mz_uint16_t)(m_value##u))
#endif

#if !defined(mz_uint32_t)
# define __mz_uint32_t                                               unsigned int
# define mz_uint32_t                                                 __mz_uint32_t
# define mz_uint32_const(m_value)                                    ((__mz_uint32_t)(m_value##u))
#endif

#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(_MSC_VER)
# if !defined(mz_uint64_t)
define __mz_uint64_t                                              unsigned __int64
define mz_uint64_t                                                __mz_uint64_t
define mz_uint64_const(m_value)                                   ((__mz_uint64_t)(m_value##ui64))
# endif
#else
# if !defined(mz_uint64_t)
define __mz_uint64_t                                              unsigned long long
define mz_uint64_t                                                __mz_uint64_t
define mz_uint64_const(m_value)                                   ((__mz_uint64_t)(m_value##ull))
# endif
#endif

/* ---- CRC type define */

#if !defined(mz_crc8_t)
# define __mz_crc8_t                                                 __mz_uint8_t
# define mz_crc8_t                                                   __mz_crc8_t
# define mz_crc8_const(m_value)                                      mz_uint8_const(m_value)
#endif

#if !defined(mz_crc16_t)
# define __mz_crc16_t                                                __mz_uint16_t
# define mz_crc16_t                                                  __mz_crc16_t
# define mz_crc16_const(m_value)                                     mz_uint16_const(m_value)
#endif

#if !defined(mz_crc32_t)
# define __mz_crc32_t                                                __mz_uint32_t
# define mz_crc32_t                                                  __mz_crc32_t
# define mz_crc32_const(m_value)                                     mz_uint32_const(m_value)
#endif

#if !defined(mz_crc64_t)
# define __mz_crc64_t                                                __mz_uint64_t
# define mz_crc64_t                                                  __mz_crc64_t
# define mz_crc64_const(m_value)                                     mz_uint64_const(m_value)
#endif

/* ---- Const pointer macro */

#if !defined(mz_peek_const_vector)
# define mz_peek_const_vector(m_cast,m_base,m_sign,m_offset)         ((m_cast)((const void *)(((const mz_uint8_t *)(m_base)) m_sign ((size_t)(m_offset)))))
#endif

#if !defined(mz_peek_const_f)
# define mz_peek_const_f(m_cast,m_base,m_offset)                     mz_peek_const_vector(m_cast,m_base,+,m_offset)
#endif

#if !defined(mz_peek_const_r)
# define mz_peek_const_r(m_cast,m_base,m_offset)                     mz_peek_const_vector(m_cast,m_base,-,m_offset)
#endif

#if !defined(mz_peek_const)
# define mz_peek_const(m_base,m_offset)                              mz_peek_const_vector(const void *,m_base,+,m_offset)
#endif

/* ---- Pointer macro */

#if !defined(mz_peek_vector)
# define mz_peek_vector(m_cast,m_base,m_sign,m_offset)               ((m_cast)((void *)(((mz_uint8_t *)(m_base)) m_sign ((size_t)(m_offset)))))
#endif

#if !defined(mz_peek_f)
# define mz_peek_f(m_cast,m_base,m_offset)                           mz_peek_vector(m_cast,m_base,+,m_offset)
#endif

#if !defined(mz_peek_r)
# define mz_peek_r(m_cast,m_base,m_offset)                           mz_peek_vector(m_cast,m_base,-,m_offset)
#endif

#if !defined(mz_peek)
# define mz_peek(m_base,m_offset)                                    mz_peek_vector(void *,m_base,+,m_offset)
#endif

/* ---- Memory peek macro */

#if !defined(mz_peek_const_type)
# define mz_peek_const_type(m_cast,m_from,m_offset)                  (*(mz_peek_const_f(const m_cast *,m_from,m_offset)))
#endif

#if !defined(mz_peek_uint8)
# define mz_peek_uint8(m_from,m_offset)                              mz_peek_const_type(mz_uint8_t,m_from,m_offset)
#endif

#if !defined(mz_peek_uint16)
# define mz_peek_uint16(m_from,m_offset)                             mz_peek_const_type(mz_uint16_t,m_from,m_offset)
#endif

#if !defined(mz_peek_uint32)
# define mz_peek_uint32(m_from,m_offset)                             mz_peek_const_type(mz_uint32_t,m_from,m_offset)
#endif

#if !defined(mz_peek_uint64)
# define mz_peek_uint64(m_from,m_offset)                             mz_peek_const_type(mz_uint64_t,m_from,m_offset)
#endif

/* ---- Memory poke macro */

#if !defined(mz_peek_type)
# define mz_peek_type(m_cast,m_from,m_offset)                        (*(mz_peek_f(m_cast *,m_from,m_offset)))
#endif

#if !defined(mz_poke_type)
# define mz_poke_type(m_cast,m_from,m_offset,m_value)                do{mz_peek_type(m_cast,m_from,m_offset)=(m_cast)(m_value);}while(0)
#endif

#if !defined(mz_poke_uint8)
# define mz_poke_uint8(m_from,m_offset,m_value)                      mz_poke_type(mz_uint8_t,m_from,m_offset,m_value)
#endif

#if !defined(mz_poke_uint16)
# define mz_poke_uint16(m_from,m_offset,m_value)                     mz_poke_type(mz_uint16_t,m_from,m_offset,m_value)
#endif

#if !defined(mz_poke_uint32)
# define mz_poke_uint32(m_from,m_offset,m_value)                     mz_poke_type(mz_uint32_t,m_from,m_offset,m_value)
#endif

#if !defined(mz_poke_uint64)
# define mz_poke_uint64(m_from,m_offset,m_value)                     mz_poke_type(mz_uint64_t,m_from,m_offset,m_value)
#endif

/* ---- Lock/Unlock wrapper macro */

#if !defined(mz_lock_t)
# define __mz_lock_t                                                 int
# define mz_lock_t                                                   __mz_lock_t
#endif

#if !defined(def_mz_init_lock)
# define def_mz_init_lock                                            0
#endif

#if !defined(mz_rw_lock)
# define mz_rw_lock(m_lock)                                          *(m_lock)=1
#endif

#if !defined(mz_unlock)
# define mz_unlock(m_lock)                                           *(m_lock)=0
#endif

/* ---- CRC const define */

#define def_mz_crc16_ibm_polynomial                                  mz_crc16_const(0x8005)
#define def_mz_crc16_ibm_final_xor                                   mz_crc16_const(0x0000)
#define def_mz_crc16_ibm_init                                        mz_crc16_const(0x0000)

#define def_mz_crc16_ccitt_polynomial                                mz_crc16_const(0x1021)
#define def_mz_crc16_ccitt_final_xor                                 mz_crc16_const(0x0000)
#define def_mz_crc16_ccitt_init                                      mz_crc16_const(0xffff)

#define def_mz_crc32_ieee_802_3_polynomial                           mz_crc32_const(0x04c11db7)
#define def_mz_crc32_ieee_802_3_final_xor                            mz_crc32_const(0xffffffff)
#define def_mz_crc32_ieee_802_3_init                                 mz_crc32_const(0xffffffff)

#define def_mz_crc64_iso_polynomial                                  mz_crc64_const(0x000000000000001b)
#define def_mz_crc64_iso_final_xor                                   mz_crc64_const(0xffffffffffffffff)
#define def_mz_crc64_iso_init                                        mz_crc64_const(0xffffffffffffffff)

/* ---- CRC logic template macro */

#define mz_reverse_bit_order_crc8(m_value)                           mz_reverse_bit_order_uint8(m_value)
#define mz_reverse_bit_order_crc16(m_value)                          mz_reverse_bit_order_uint16(m_value)
#define mz_reverse_bit_order_crc32(m_value)                          mz_reverse_bit_order_uint32(m_value)
#define mz_reverse_bit_order_crc64(m_value)                          mz_reverse_bit_order_uint64(m_value)

/* CRC(Cyclic Redundancy Check) 8/16/32/64/... template (big, fast) */
#define __mz_crc_fast_template(m_type,m_polynomial,m_final_xor,m_is_first,m_seed,m_data,m_size) \
    static mz_lock_t sg_lock = def_mz_init_lock;\
    static volatile int sg_init_table = 0;\
    static volatile mz_##m_type##_t sg_table[ 256 ];\
\
    size_t s_index;\
\
    if(mz_builtin_expect((m_data) == NULL, 0)) {\
        return((m_seed));\
    }\
\
    mz_rw_lock((mz_lock_t *)(&sg_lock));\
    if(mz_builtin_expect(sg_init_table == 0, 0)) {\
        mz_##m_type##_t s_reverse_polynomial = mz_reverse_bit_order_##m_type(m_polynomial);\
        mz_##m_type##_t s_value;\
\
        for(s_index = ((size_t)0);s_index < ((sizeof(sg_table) / sizeof(mz_##m_type##_t)));s_index++) {\
            s_value = (mz_##m_type##_t)s_index;\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            s_value = (s_value >> 1) ^ (s_reverse_polynomial & ((~(s_value & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
            sg_table[s_index] = s_value;\
        }\
\
        sg_init_table = 1;\
    }\
    mz_unlock((mz_lock_t *)(&sg_lock));\
\
    if((m_is_first) == 0) {\
        (m_seed) ^= (m_final_xor);\
    }\
\
    for(s_index = ((size_t)0);s_index < (m_size);s_index++) {\
        (m_seed) = sg_table[((m_seed) ^ ((mz_##m_type##_t)mz_peek_uint8((m_data), s_index))) & mz_##m_type##_const(0xff)] ^ ((m_seed) >> 8);\
    }\
\
    return((m_seed) ^ (m_final_xor))

/* CRC(Cyclic Redundancy Check) 8/16/32/64/... slow template (small, slow) */
#define __mz_crc_slow_template(m_type,m_polynomial,m_final_xor,m_is_first,m_seed,m_data,m_size) \
    size_t s_offset;\
    mz_##m_type##_t s_reverse_polynomial = mz_reverse_bit_order_##m_type(m_polynomial);\
\
    if(mz_builtin_expect((m_data) == NULL, 0)) {\
        return((m_seed));\
    }\
\
    if((m_is_first) == 0) {\
        (m_seed) ^= (m_final_xor);\
    }\
\
    for(s_offset = ((size_t)0);s_offset < (m_size);s_offset++) {\
        (m_seed) = (m_seed) ^ ((mz_##m_type##_t)mz_peek_uint8((m_data),s_offset));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
        (m_seed) = ((m_seed) >> 1) ^ (s_reverse_polynomial & ((~((m_seed) & mz_##m_type##_const(1))) + mz_##m_type##_const(1)));\
    }\
\
    return(s_seed ^ (m_final_xor))

/* ---- crc api */

#if !defined(__SOURCE_MZCRC_C__)

def_mz_import_c mz_uint8_t mz_reverse_bit_order_uint8(mz_uint8_t s_value);
def_mz_import_c mz_uint16_t mz_reverse_bit_order_uint16(mz_uint16_t s_value);
def_mz_import_c mz_uint32_t mz_reverse_bit_order_uint32(mz_uint32_t s_value);
def_mz_import_c mz_uint64_t mz_reverse_bit_order_uint64(mz_uint64_t s_value);

def_mz_import_c mz_crc16_t mz_crc16_ibm(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size);
def_mz_import_c mz_crc16_t mz_crc16_ccitt(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size);
def_mz_import_c mz_crc32_t mz_crc32_ieee_802_3(int s_is_first, mz_crc32_t s_seed, const void *s_data, size_t s_size);
def_mz_import_c mz_crc64_t mz_crc64_iso(int s_is_first, mz_crc64_t s_seed, const void *s_data, size_t s_size);

#endif

/* ---- default logic select */

/* Generic CRC16 is IBM */
#define def_mz_crc16_polynomial                                      def_mz_crc16_ibm_polynomial
#define def_mz_crc16_final_xor                                       def_mz_crc16_ibm_final_xor
#define def_mz_crc16_init                                            def_mz_crc16_ibm_init
#define mz_crc16(m_is_first,m_seed,m_data,m_size)                    mz_crc16_ibm(m_is_first,m_seed,m_data,m_size)
#define mz_crc16_first(m_data,m_size)                                mz_crc16(def_mz_true,def_mz_crc16_init,m_data,m_size)
#define mz_crc16_update(m_seed,m_data,m_size)                        mz_crc16(def_mz_false,m_seed,m_data,m_size)

/* Generic CRC32 is IEEE 802.3 */
#define def_mz_crc32_polynomial                                      def_mz_crc32_ieee_802_3_polynomial
#define def_mz_crc32_final_xor                                       def_mz_crc32_ieee_802_3_final_xor
#define def_mz_crc32_init                                            def_mz_crc32_ieee_802_3_init
#define mz_crc32(m_is_first,m_seed,m_data,m_size)                    mz_crc32_ieee_802_3(m_is_first,m_seed,m_data,m_size)
#define mz_crc32_first(m_data,m_size)                                mz_crc32(def_mz_true,def_mz_crc32_init,m_data,m_size)
#define mz_crc32_update(m_seed,m_data,m_size)                        mz_crc32(def_mz_false,m_seed,m_data,m_size)

/* Generic CRC64 is ISO */
#define def_mz_crc64_polynomial                                      def_mz_crc64_iso_polynomial
#define def_mz_crc64_final_xor                                       def_mz_crc64_iso_final_xor
#define def_mz_crc64_init                                            def_mz_crc64_iso_init
#define mz_crc64(m_is_first,m_seed,m_data,m_size)                    mz_crc64_iso(m_is_first,m_seed,m_data,m_size)
#define mz_crc64_first(m_data,m_size)                                mz_crc64(def_mz_true,def_mz_crc64_init,m_data,m_size)
#define mz_crc64_update(m_seed,m_data,m_size)                        mz_crc64(def_mz_false,m_seed,m_data,m_size)

/* ---- */

#endif

/* vim: set expandtab: */
/* End of source */

/*
 Copyright (C) JAEHYUK CHO
 All rights reserved.
 
 Author: JaeHyuk Cho <minzkn@minzkn.com>
*/

#if !defined(__SOURCE_MZCRC_C__)
# define __SOURCE_MZCRC_C__ "mzcrc.c"

#include "mzcrc.h"

def_mz_export_c mz_uint8_t mz_reverse_bit_order_uint8(mz_uint8_t s_value);
def_mz_export_c mz_uint16_t mz_reverse_bit_order_uint16(mz_uint16_t s_value);
def_mz_export_c mz_uint32_t mz_reverse_bit_order_uint32(mz_uint32_t s_value);
def_mz_export_c mz_uint64_t mz_reverse_bit_order_uint64(mz_uint64_t s_value);

def_mz_export_c mz_crc16_t mz_crc16_ibm(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size);
def_mz_export_c mz_crc16_t mz_crc16_ccitt(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size);
def_mz_export_c mz_crc32_t mz_crc32_ieee_802_3(int s_is_first, mz_crc32_t s_seed, const void *s_data, size_t s_size);
def_mz_export_c mz_crc64_t mz_crc64_iso(int s_is_first, mz_crc64_t s_seed, const void *s_data, size_t s_size);

static const mz_uint8_t __g_mz_reverse_bit_order_table[ /* 256 */ ] = {
    /* 0x00 */  mz_uint8_const(0x00), mz_uint8_const(0x80), mz_uint8_const(0x40), mz_uint8_const(0xc0),
    /* 0x04 */  mz_uint8_const(0x20), mz_uint8_const(0xa0), mz_uint8_const(0x60), mz_uint8_const(0xe0),
    /* 0x08 */  mz_uint8_const(0x10), mz_uint8_const(0x90), mz_uint8_const(0x50), mz_uint8_const(0xd0),
    /* 0x0c */  mz_uint8_const(0x30), mz_uint8_const(0xb0), mz_uint8_const(0x70), mz_uint8_const(0xf0),
    /* 0x10 */  mz_uint8_const(0x08), mz_uint8_const(0x88), mz_uint8_const(0x48), mz_uint8_const(0xc8),
    /* 0x14 */  mz_uint8_const(0x28), mz_uint8_const(0xa8), mz_uint8_const(0x68), mz_uint8_const(0xe8),
    /* 0x18 */  mz_uint8_const(0x18), mz_uint8_const(0x98), mz_uint8_const(0x58), mz_uint8_const(0xd8),
    /* 0x1c */  mz_uint8_const(0x38), mz_uint8_const(0xb8), mz_uint8_const(0x78), mz_uint8_const(0xf8),
    /* 0x20 */  mz_uint8_const(0x04), mz_uint8_const(0x84), mz_uint8_const(0x44), mz_uint8_const(0xc4),
    /* 0x24 */  mz_uint8_const(0x24), mz_uint8_const(0xa4), mz_uint8_const(0x64), mz_uint8_const(0xe4),
    /* 0x28 */  mz_uint8_const(0x14), mz_uint8_const(0x94), mz_uint8_const(0x54), mz_uint8_const(0xd4),
    /* 0x2c */  mz_uint8_const(0x34), mz_uint8_const(0xb4), mz_uint8_const(0x74), mz_uint8_const(0xf4),
    /* 0x30 */  mz_uint8_const(0x0c), mz_uint8_const(0x8c), mz_uint8_const(0x4c), mz_uint8_const(0xcc),
    /* 0x34 */  mz_uint8_const(0x2c), mz_uint8_const(0xac), mz_uint8_const(0x6c), mz_uint8_const(0xec),
    /* 0x38 */  mz_uint8_const(0x1c), mz_uint8_const(0x9c), mz_uint8_const(0x5c), mz_uint8_const(0xdc),
    /* 0x3c */  mz_uint8_const(0x3c), mz_uint8_const(0xbc), mz_uint8_const(0x7c), mz_uint8_const(0xfc),
    /* 0x40 */  mz_uint8_const(0x02), mz_uint8_const(0x82), mz_uint8_const(0x42), mz_uint8_const(0xc2),
    /* 0x44 */  mz_uint8_const(0x22), mz_uint8_const(0xa2), mz_uint8_const(0x62), mz_uint8_const(0xe2),
    /* 0x48 */  mz_uint8_const(0x12), mz_uint8_const(0x92), mz_uint8_const(0x52), mz_uint8_const(0xd2),
    /* 0x4c */  mz_uint8_const(0x32), mz_uint8_const(0xb2), mz_uint8_const(0x72), mz_uint8_const(0xf2),
    /* 0x50 */  mz_uint8_const(0x0a), mz_uint8_const(0x8a), mz_uint8_const(0x4a), mz_uint8_const(0xca),
    /* 0x54 */  mz_uint8_const(0x2a), mz_uint8_const(0xaa), mz_uint8_const(0x6a), mz_uint8_const(0xea),
    /* 0x58 */  mz_uint8_const(0x1a), mz_uint8_const(0x9a), mz_uint8_const(0x5a), mz_uint8_const(0xda),
    /* 0x5c */  mz_uint8_const(0x3a), mz_uint8_const(0xba), mz_uint8_const(0x7a), mz_uint8_const(0xfa),
    /* 0x60 */  mz_uint8_const(0x06), mz_uint8_const(0x86), mz_uint8_const(0x46), mz_uint8_const(0xc6),
    /* 0x64 */  mz_uint8_const(0x26), mz_uint8_const(0xa6), mz_uint8_const(0x66), mz_uint8_const(0xe6),
    /* 0x68 */  mz_uint8_const(0x16), mz_uint8_const(0x96), mz_uint8_const(0x56), mz_uint8_const(0xd6),
    /* 0x6c */  mz_uint8_const(0x36), mz_uint8_const(0xb6), mz_uint8_const(0x76), mz_uint8_const(0xf6),
    /* 0x70 */  mz_uint8_const(0x0e), mz_uint8_const(0x8e), mz_uint8_const(0x4e), mz_uint8_const(0xce),
    /* 0x74 */  mz_uint8_const(0x2e), mz_uint8_const(0xae), mz_uint8_const(0x6e), mz_uint8_const(0xee),
    /* 0x78 */  mz_uint8_const(0x1e), mz_uint8_const(0x9e), mz_uint8_const(0x5e), mz_uint8_const(0xde),
    /* 0x7c */  mz_uint8_const(0x3e), mz_uint8_const(0xbe), mz_uint8_const(0x7e), mz_uint8_const(0xfe),
    /* 0x80 */  mz_uint8_const(0x01), mz_uint8_const(0x81), mz_uint8_const(0x41), mz_uint8_const(0xc1),
    /* 0x84 */  mz_uint8_const(0x21), mz_uint8_const(0xa1), mz_uint8_const(0x61), mz_uint8_const(0xe1),
    /* 0x88 */  mz_uint8_const(0x11), mz_uint8_const(0x91), mz_uint8_const(0x51), mz_uint8_const(0xd1),
    /* 0x8c */  mz_uint8_const(0x31), mz_uint8_const(0xb1), mz_uint8_const(0x71), mz_uint8_const(0xf1),
    /* 0x90 */  mz_uint8_const(0x09), mz_uint8_const(0x89), mz_uint8_const(0x49), mz_uint8_const(0xc9),
    /* 0x94 */  mz_uint8_const(0x29), mz_uint8_const(0xa9), mz_uint8_const(0x69), mz_uint8_const(0xe9),
    /* 0x98 */  mz_uint8_const(0x19), mz_uint8_const(0x99), mz_uint8_const(0x59), mz_uint8_const(0xd9),
    /* 0x9c */  mz_uint8_const(0x39), mz_uint8_const(0xb9), mz_uint8_const(0x79), mz_uint8_const(0xf9),
    /* 0xa0 */  mz_uint8_const(0x05), mz_uint8_const(0x85), mz_uint8_const(0x45), mz_uint8_const(0xc5),
    /* 0xa4 */  mz_uint8_const(0x25), mz_uint8_const(0xa5), mz_uint8_const(0x65), mz_uint8_const(0xe5),
    /* 0xa8 */  mz_uint8_const(0x15), mz_uint8_const(0x95), mz_uint8_const(0x55), mz_uint8_const(0xd5),
    /* 0xac */  mz_uint8_const(0x35), mz_uint8_const(0xb5), mz_uint8_const(0x75), mz_uint8_const(0xf5),
    /* 0xb0 */  mz_uint8_const(0x0d), mz_uint8_const(0x8d), mz_uint8_const(0x4d), mz_uint8_const(0xcd),
    /* 0xb4 */  mz_uint8_const(0x2d), mz_uint8_const(0xad), mz_uint8_const(0x6d), mz_uint8_const(0xed),
    /* 0xb8 */  mz_uint8_const(0x1d), mz_uint8_const(0x9d), mz_uint8_const(0x5d), mz_uint8_const(0xdd),
    /* 0xbc */  mz_uint8_const(0x3d), mz_uint8_const(0xbd), mz_uint8_const(0x7d), mz_uint8_const(0xfd),
    /* 0xc0 */  mz_uint8_const(0x03), mz_uint8_const(0x83), mz_uint8_const(0x43), mz_uint8_const(0xc3),
    /* 0xc4 */  mz_uint8_const(0x23), mz_uint8_const(0xa3), mz_uint8_const(0x63), mz_uint8_const(0xe3),
    /* 0xc8 */  mz_uint8_const(0x13), mz_uint8_const(0x93), mz_uint8_const(0x53), mz_uint8_const(0xd3),
    /* 0xcc */  mz_uint8_const(0x33), mz_uint8_const(0xb3), mz_uint8_const(0x73), mz_uint8_const(0xf3),
    /* 0xd0 */  mz_uint8_const(0x0b), mz_uint8_const(0x8b), mz_uint8_const(0x4b), mz_uint8_const(0xcb),
    /* 0xd4 */  mz_uint8_const(0x2b), mz_uint8_const(0xab), mz_uint8_const(0x6b), mz_uint8_const(0xeb),
    /* 0xd8 */  mz_uint8_const(0x1b), mz_uint8_const(0x9b), mz_uint8_const(0x5b), mz_uint8_const(0xdb),
    /* 0xdc */  mz_uint8_const(0x3b), mz_uint8_const(0xbb), mz_uint8_const(0x7b), mz_uint8_const(0xfb),
    /* 0xe0 */  mz_uint8_const(0x07), mz_uint8_const(0x87), mz_uint8_const(0x47), mz_uint8_const(0xc7),
    /* 0xe4 */  mz_uint8_const(0x27), mz_uint8_const(0xa7), mz_uint8_const(0x67), mz_uint8_const(0xe7),
    /* 0xe8 */  mz_uint8_const(0x17), mz_uint8_const(0x97), mz_uint8_const(0x57), mz_uint8_const(0xd7),
    /* 0xec */  mz_uint8_const(0x37), mz_uint8_const(0xb7), mz_uint8_const(0x77), mz_uint8_const(0xf7),
    /* 0xf0 */  mz_uint8_const(0x0f), mz_uint8_const(0x8f), mz_uint8_const(0x4f), mz_uint8_const(0xcf),
    /* 0xf4 */  mz_uint8_const(0x2f), mz_uint8_const(0xaf), mz_uint8_const(0x6f), mz_uint8_const(0xef),
    /* 0xf8 */  mz_uint8_const(0x1f), mz_uint8_const(0x9f), mz_uint8_const(0x5f), mz_uint8_const(0xdf),
    /* 0xfc */  mz_uint8_const(0x3f), mz_uint8_const(0xbf), mz_uint8_const(0x7f), mz_uint8_const(0xff)
};
#define __mz_reverse_bit_order_uint8(m_value) __g_mz_reverse_bit_order_table[m_value]

mz_uint8_t mz_reverse_bit_order_uint8(mz_uint8_t s_value)
{
    return(__mz_reverse_bit_order_uint8(s_value));
}

mz_uint16_t mz_reverse_bit_order_uint16(mz_uint16_t s_value)
{
    mz_uint16_t s_result;

    mz_poke_uint8(&s_result, 1, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 0)));
    mz_poke_uint8(&s_result, 0, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 1)));

    return(s_result);
}

mz_uint32_t mz_reverse_bit_order_uint32(mz_uint32_t s_value)
{
    mz_uint32_t s_result;
    
    mz_poke_uint8(&s_result, 3, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 0)));
    mz_poke_uint8(&s_result, 2, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 1)));
    mz_poke_uint8(&s_result, 1, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 2)));
    mz_poke_uint8(&s_result, 0, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 3)));

    return(s_result);
}

mz_uint64_t mz_reverse_bit_order_uint64(mz_uint64_t s_value)
{
    mz_uint64_t s_result;
    
    mz_poke_uint8(&s_result, 7, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 0)));
    mz_poke_uint8(&s_result, 6, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 1)));
    mz_poke_uint8(&s_result, 5, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 2)));
    mz_poke_uint8(&s_result, 4, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 3)));
    mz_poke_uint8(&s_result, 3, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 4)));
    mz_poke_uint8(&s_result, 2, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 5)));
    mz_poke_uint8(&s_result, 1, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 6)));
    mz_poke_uint8(&s_result, 0, __mz_reverse_bit_order_uint8(mz_peek_uint8(&s_value, 7)));

    return(s_result);
}

mz_crc16_t mz_crc16_ibm(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size)
{
    __mz_crc_slow_template(crc16,def_mz_crc16_ibm_polynomial,def_mz_crc16_ibm_final_xor,s_is_first,s_seed,s_data,s_size);
}

mz_crc16_t mz_crc16_ccitt(int s_is_first, mz_crc16_t s_seed, const void *s_data, size_t s_size)
{
    __mz_crc_slow_template(crc16,def_mz_crc16_ccitt_polynomial,def_mz_crc16_ccitt_final_xor,s_is_first,s_seed,s_data,s_size);
}

mz_crc32_t mz_crc32_ieee_802_3(int s_is_first, mz_crc32_t s_seed, const void *s_data, size_t s_size)
{
    __mz_crc_fast_template(crc32,def_mz_crc32_ieee_802_3_polynomial,def_mz_crc32_ieee_802_3_final_xor,s_is_first,s_seed,s_data,s_size);
}

mz_crc64_t mz_crc64_iso(int s_is_first, mz_crc64_t s_seed, const void *s_data, size_t s_size)
{
    __mz_crc_slow_template(crc64,def_mz_crc64_iso_polynomial,def_mz_crc64_iso_final_xor,s_is_first,s_seed,s_data,s_size);
}

#endif

/* vim: set expandtab: */
/* End of source */
크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
修身齊家治國平天下 (수신제가치국평천하)
匠人精神 (장인정신)
도구의 결함은 장인의 손으로 극복한다.
창조는 지식보다 위대하다.
2009/02/19 23:53 2009/02/19 23:53
받은 트랙백이 없고, 댓글 하나가 달렸습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/498

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/498

트랙백 주소 :: http://blog.minzkn.com/trackback/498

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/498

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/498

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/498
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/498
  1. kalstein 2009/02/20 11:09  댓글주소  수정/삭제  댓글쓰기

    C++을 지원안하는 환경이시면 또 모르겠는데요...C++에서는 boost library에 CRC가 있습니다. 그럼. ^^

[로그인][오픈아이디란?]