
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 */



글
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/498댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/498
C++을 지원안하는 환경이시면 또 모르겠는데요...C++에서는 boost library에 CRC가 있습니다. 그럼. ^^