メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcCRC.h

CRCルーチン boost::crcのC言語移植版 [詳細]

`#include "dkcOSIndependent.h"`

dkcCRC.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

## 構成
struct | dkc_CRC
## 型定義
typedef dkc_CRC | DKC_CRC
## 関数
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC (size_t Bits, ULONG TruncPoly, ULONG InitRem, ULONG FinalXor, dkctBOOL ReflectIn, dkctBOOL ReflectRem)
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_32left ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_32right ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_ansi16left ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_ansi16right ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_ccitt_left ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_ccitt_right ()
DKC_EXTERN DKC_CRC *WINAPI | dkcAllocCRC_xmodem ()
DKC_EXTERN int WINAPI | dkcFreeCRC (DKC_CRC **pp)
DKC_EXTERN int WINAPI | dkcCRCInit (DKC_CRC *p, void *buffer, size_t Bits, ULONG TruncPoly, ULONG InitRem, ULONG FinalXor, dkctBOOL ReflectIn, dkctBOOL ReflectRem)
DKC_EXTERN size_t WINAPI | dkcCRCGetUseTableSize (size_t Bits)
| dkcCRCInit()のbufferに渡すバッファサイズを求める。
DKC_EXTERN void WINAPI | dkcCRCLoad (DKC_CRC *p, const BYTE *pBuffer, size_t size)
DKC_EXTERN void WINAPI | dkcCRCLoadBlock (DKC_CRC *p, const void *Begin, const void *End)
DKC_EXTERN ULONG WINAPI | dkcCRCFinal (DKC_CRC *p)
DKC_EXTERN ULONG WINAPI | dkcCRCResult (const DKC_CRC *p)

## 説明

CRCルーチン boost::crcのC言語移植版

作者:
  d金魚

から:
  2004/08/24

バグ:
  まだバグチェックしていない。まだ、ある。
  覚え書き:

Licence : http://www.boost.org/LICENSE_1_0.txt

サポートしていそうなCRC

- CRC32 left right

- CRC-CCITT left right (ITU-T V.41 ... X^16 + X^12 + X^5 + 1 ) (HDLC ??)
- XMODEM left right
- CRC ANSI16 left right

- CRC12 x12+x11+x3+x2+x1+１
- CRC7

boost::crcのC言語版を目指していると考えていただくと分かりやすいかと･･･。
それにしてもboostcrcの実装はかなりE感じ。
ULONGとしている所がE感じのテクだと思った。
（MinGW等ではtemplate<class T,class C=stdvector<T> >みたいな事が出来ない。)

### 参考資料

- http://www.kmonos.net/alang/boost/classes/crc.html
- http://hp.vector.co.jp/authors/VA011148/srclib.html

dkcCRC.h で定義されています。

## 型定義

typedef struct dkc_CRC DKC_CRC

## 関数

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC | ( | size_t | Bits,
|  | ULONG | TruncPoly,
|  | ULONG | InitRem,
|  | ULONG | FinalXor,
|  | dkctBOOL | ReflectIn,
|  | dkctBOOL | ReflectRem
| ) |

| dkcCRC.c の 227 行で定義されています。 参照先 dkcAllocate(), dkcCRCGetUseTableSize(), dkcCRCInit(), dkcFree(), と NULL. 参照元 dkcAllocCRC_32left(), dkcAllocCRC_32right(), dkcAllocCRC_7left(), dkcAllocCRC_7right(), dkcAllocCRC_ansi16left(), dkcAllocCRC_ansi16right(), dkcAllocCRC_ccitt_left(), dkcAllocCRC_ccitt_right(), と dkcAllocCRC_xmodem().
    00230 {
    00231     DKC_CRC *p = (DKC_CRC *)dkcAllocate(sizeof(DKC_CRC));
    00232     void *pt;
    00233
    00234     if(NULL==p){
    00235         return NULL;
    00236     }
    00237     pt = dkcAllocate(dkcCRCGetUseTableSize(Bits));
    00238     if(NULL==pt){
    00239         goto Error;
    00240     }
    00241     dkcCRCInit(p,pt,Bits,TruncPoly,InitRem,FinalXor,ReflectIn,ReflectRem);
    00242
    00243     return p;
    00244
    00245 Error:
    00246     dkcFree((void **)&p);
    00247     return NULL;
    00248 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_32left | ( |  | ) |

| dkcCRC.c の 250 行で定義されています。 参照先 dkcAllocCRC(), と FALSE.
    00250                                     {
    00251     return dkcAllocCRC(32, 0xEDB88320, 0xFFFFFFFF, 0xFFFFFFFF, FALSE, FALSE);
    00252
    00253 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_32right | ( |  | ) |

| dkcCRC.c の 255 行で定義されています。 参照先 dkcAllocCRC(), と TRUE.
    00255                                      {
    00256     //バグ ... 値を治す
    00257     return dkcAllocCRC(32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, TRUE, TRUE);
    00258 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_ansi16left | ( |  | ) |

| dkcCRC.c の 259 行で定義されています。 参照先 dkcAllocCRC(), と TRUE.
    00259                                         {
    00260     return dkcAllocCRC(16, 0x8005, 0, 0, TRUE,TRUE);
    00261 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_ansi16right | ( |  | ) |

| dkcCRC.c の 263 行で定義されています。 参照先 dkcAllocCRC(), と FALSE.
    00263                                          {
    00264     return dkcAllocCRC(16, 0xa001, 0, 0, FALSE,FALSE);
    00265 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_ccitt_left | ( |  | ) |

| dkcCRC.c の 267 行で定義されています。 参照先 dkcAllocCRC(), と FALSE.
    00267                                         {
    00268     return dkcAllocCRC(16, 0x1021, 0xFFFF, 0, FALSE,FALSE);
    00269 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_ccitt_right | ( |  | ) |

| dkcCRC.c の 270 行で定義されています。 参照先 dkcAllocCRC(), と TRUE.
    00270                                          {
    00271     return dkcAllocCRC(16, 0x8005, 0xFFFF, 0, TRUE,TRUE);
    00272 }

DKC_EXTERN DKC_CRC* WINAPI dkcAllocCRC_xmodem | ( |  | ) |

| dkcCRC.c の 280 行で定義されています。 参照先 dkcAllocCRC(), と TRUE.
    00280                                     {
    00281     return dkcAllocCRC(16, 0x8408, 0, 0, TRUE,TRUE);
    00282 }

DKC_EXTERN ULONG WINAPI dkcCRCFinal | ( | DKC_CRC * | p | ) |

  | 引数:
  | p[in][out] | dkcAllocSHA1()で取得したポインタ
覚え書き: dkcCRC.c の 490 行で定義されています。 参照先 mask_value(), dkc_CRC::mBits, dkc_CRC::mFinalXor, dkc_CRC::mR, dkc_CRC::mReflectIn, dkc_CRC::mReflectRem, dkc_CRC::mResult, と reflection().
    00490                                     {
    00491     BOOL b = (p->mReflectRem != p->mReflectIn);
    00492     size_t Bits = p->mBits;
    00493     ULONG ult = mask_value(Bits);
    00494         //~(0x80000000 >> (Bits ));//( ( 1u ) << ( get_sigbit(Bits) - 1u ) );
    00495     //変数の再利用･･･。本当はしたくないのだが･･･。
    00496     Bits = ( reflection(b,Bits,p->mR) ^ p->mFinalXor ) & ult;
    00497
    00498     p->mResult = Bits;
    00499
    00500     return Bits;
    00501
    00502
    00503     //reflect_out_type::reflect(rem_) ^ get_final_xor_value() )
    00504   //   & masking_type::sig_bits_fast;
    00505 }

DKC_EXTERN size_t WINAPI dkcCRCGetUseTableSize | ( | size_t | Bits | ) |

  | dkcCRCInit()のbufferに渡すバッファサイズを求める。 引数:
  | Bits[in] | 指定するCRC値(dkcCRCInit()のBitsと同じ値にする)
戻り値: 0だとエラー それ以外は 使用するであろうテーブルのbyte単位のサイズを返す。 dkcCRC.c の 214 行で定義されています。 参照元 dkcAllocCRC().
    00214                                                 {
    00215     //手抜き演算〜〜
    00216     size_t t;
    00217     if(Bits <= 16){
    00218         t = sizeof(USHORT) * 0x100;
    00219     }else if(Bits <= 32){
    00220         t = sizeof(ULONG) * 0x100;
    00221     }else{
    00222         t = 0;
    00223     }
    00224     return t;
    00225 }

DKC_EXTERN int WINAPI dkcCRCInit | ( | DKC_CRC * | p,
|  | void * | buffer,
|  | size_t | Bits,
|  | ULONG | TruncPoly,
|  | ULONG | InitRem,
|  | ULONG | FinalXor,
|  | dkctBOOL | ReflectIn,
|  | dkctBOOL | ReflectRem
| ) |

  | 引数:
  | p[in][out] | 初期化したいCRC構造体へのポインタ
  | buffer[in] | 指定したいバッファ先 ULONGかUSHORT256個の配列である事
  | Bits[in] | 何ビットのCRC値を生成するか。普通は16とか32が一般的
  | TruncPoly[in] | 生成多項式
  | InitRem[in] | 初期値
  | FinalXor[in] | CRC計算の最後にXORする値
  | ReflectIn[in] | 反対にするかどうか。
  | ReflectRem[in] | 反対にするかどうか･･･。(スマン、ヨクワカラン）boostcrcを移植しただけだし･･･。
dkcCRC.c の 330 行で定義されています。 参照先 makecrctable16(), makecrctable32(), dkc_CRC::mBits, dkc_CRC::mFinalXor, dkc_CRC::mInitRem, dkc_CRC::mR, dkc_CRC::mReflectIn, dkc_CRC::mReflectRem, dkc_CRC::mResult, dkc_CRC::mTable, dkc_CRC::mTruncPoly, と reflection(). 参照元 dkcAllocCRC().
    00334 {
    00335     int r;
    00336
    00337     //初期値
    00338     p->mR = reflection(ReflectIn,Bits,InitRem);
    00339     //処理結果
    00340     p->mResult = 0;
    00341     //テーブルへのポインタ
    00342     p->mTable = buffer;
    00343
    00344     p->mBits = Bits;
    00345     p->mTruncPoly = TruncPoly;
    00346     p->mInitRem = InitRem;
    00347     p->mFinalXor = FinalXor;
    00348     p->mReflectIn = ReflectIn;
    00349     p->mReflectRem = ReflectRem;
    00350
    00351
    00352
    00353     if(Bits <= 16){
    00354         r = makecrctable16((USHORT *)buffer,Bits,TruncPoly,ReflectIn);
    00355         //p->mLoader = Loader16;
    00356     }else if(Bits <= 32){
    00357         r = makecrctable32((ULONG *)buffer,Bits,TruncPoly,ReflectIn);
    00358         //p->mLoader = Loader32;
    00359     }else{
    00360         r = edk_FAILED;
    00361     }
    00362     return r;
    00363
    00364 }

DKC_EXTERN void WINAPI dkcCRCLoad | ( | DKC_CRC * | p,
|  | const BYTE * | pBuffer,
|  | size_t | size
| ) |

  | 引数:
  | p[in][out] | DKC_CRC構造体へのポインタ
  | pBuffer[in] | 読み取るバッファへのポインタ
  | dwSize[in] | バッファにアクセスしてOKなサイズ
dkcCRC.c の 366 行で定義されています。 参照先 dkcCRCLoadBlock().
    00367 {
    00368     unsigned char const * const  b = (unsigned char const *)pBuffer;
    00369     dkcCRCLoadBlock(p, b, b + size );
    00370
    00371 }

DKC_EXTERN void WINAPI dkcCRCLoadBlock | ( | DKC_CRC * | p,
|  | const void * | Begin,
|  | const void * | End
| ) |

| dkcCRC.c の 384 行で定義されています。 参照先 BYTE, dkcmFORCE_NOT_ASSERT, index(), mask_value(), dkc_CRC::mBits, dkc_CRC::mR, dkc_CRC::mReflectIn, dkc_CRC::mTable, と shift(). 参照元 dkcCRCLoad().
    00385 {
    00386     unsigned char const * p = (unsigned char const *)bytes_begin;
    00387
    00388   unsigned char byte_index;
    00389     //for 32bit
    00390     //ULONG *pTable32 = (ULONG *)pobj->mTable;
    00391     //for 16bit
    00392     //USHORT *pTable16 = (ULONG *)pobj->mTable;
    00393
    00394
    00395
    00396     //general purpose
    00397     size_t Bits = pobj->mBits;
    00398     BOOL DoReflect = pobj->mReflectIn;
    00399
    00400     USHORT *usp;
    00401     ULONG *ulp;
    00402     ULONG rem;
    00403
    00404     ulp = (ULONG *)pobj->mTable;
    00405     usp = (USHORT *)ulp;
    00406
    00407     //もし、おかしな値になったらエンディアン系を疑ってネ＾＾；
    00408     rem = pobj->mR;
    00409
    00410
    00411     if(Bits <= 16)
    00412     {//16bit filter
    00413         // Recompute the CRC for each byte passed
    00414         for (; p < (const BYTE *)bytes_end ; ++p )
    00415         {
    00416             // Compare the new byte with the remainder's higher bits to
    00417             // get the new bits, shift out the remainder's current higher
    00418             // bits, and update the remainder with the polynominal division
    00419             // of the new bits.
    00420             byte_index = index( rem, *p ,Bits,DoReflect);
    00421             rem = (USHORT)shift( rem , DoReflect);
    00422             rem ^= usp[ byte_index ];
    00423         }
    00424
    00425         pobj->mR = rem & mask_value(Bits);
    00426
    00427     }else if(Bits <= 32)
    00428     {//32bit filter
    00429         for (; p < (const BYTE *)bytes_end ; ++p )
    00430         {
    00431
    00432             byte_index = index( rem, *p ,Bits,DoReflect);
    00433             rem = shift( rem ,DoReflect);
    00434             rem ^= ulp[ byte_index ];
    00435         }
    00436         pobj->mR = rem;
    00437     }else{
    00438         dkcmFORCE_NOT_ASSERT("dkcCRCLoadBlock中に32ビット以上の計算を要求された");
    00439     }
    00440     /*
    00441     OFFSET_PTR_UNION uni;
    00442     OFFSET_UNION rem;
    00443
    00444     uni.pt32 = (ULONG *)pobj->mTable;
    00445     //もし、おかしな値になったらエンディアン系を疑ってネ＾＾；
    00446     rem.t32 = pobj->mR;
    00447
    00448
    00449     if(Bits <= 16)
    00450     {//16bit filter
    00451         // Recompute the CRC for each byte passed
    00452         for (; p < (const BYTE *)bytes_end ; ++p )
    00453         {
    00454             // Compare the new byte with the remainder's higher bits to
    00455             // get the new bits, shift out the remainder's current higher
    00456             // bits, and update the remainder with the polynominal division
    00457             // of the new bits.
    00458             byte_index = index( rem.t16, *p ,Bits,DoReflect);
    00459             rem.t16 = (USHORT)shift( rem.t16 , DoReflect);
    00460             rem.t16 ^= uni.pt16[ byte_index ];
    00461         }
    00462
    00463         pobj->mR = rem.t16;
    00464
    00465     }else if(Bits <= 32)
    00466     {//32bit filter
    00467         for (; p < (const BYTE *)bytes_end ; ++p )
    00468         {
    00469
    00470             byte_index = index( rem.t32, *p ,Bits,DoReflect);
    00471             rem.t32 = shift( rem.t32 ,DoReflect);
    00472             rem.t32 ^= uni.pt32[ byte_index ];
    00473         }
    00474         pobj->mR = rem.t32;
    00475     }else{
    00476         dkcmFORCE_NOT_ASSERT("dkcCRCLoadBlock中に32ビット以上の計算を要求された");
    00477     }
    00478     */
    00479
    00480
    00481     //  rem.t32 & mask_value(Bits);
    00482 }

DKC_EXTERN ULONG WINAPI dkcCRCResult | ( | const DKC_CRC * | p | ) |

| dkcCRC.c の 507 行で定義されています。 参照先 dkc_CRC::mResult.
    00507                                            {
    00508     return p->mResult;
    00509 }

DKC_EXTERN int WINAPI dkcFreeCRC | ( | DKC_CRC ** | pp | ) |

| dkcCRC.c の 324 行で定義されています。 参照先 dkcFree().
    00324                                    {
    00325     dkcFree((void **)&((*pp)->mTable));
    00326     return dkcFree((void **)pp);
    00327 }