1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     util_Crc.cpp
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 26176 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_UTIL_UTIL_CRC_H_
17 #define NN_UTIL_UTIL_CRC_H_
18 
19 #include <nn/types.h>
20 
21 #ifdef __cplusplus
22 
23 namespace nn { namespace util {
24 
25 //----------------------------------------------------------------------------
26 // Constant definition
27 //----------------------------------------------------------------------------
28 
29 #define CRC8_STANDARD_POLY     0x07
30 #define CRC8_STANDARD_INIT     0
31 
32 #define CRC16_STANDARD_POLY    0xa001      // ビット反転するものは生成多項式も反転
33 #define CRC16_STANDARD_INIT    0
34 #define CRC16_CCITT_POLY       0x1021
35 #define CRC16_CCITT_INIT       0xffff
36 
37 #define CRC32_STANDARD_POLY    0xedb88320  // ビット反転するものは生成多項式も反転
38 #define CRC32_STANDARD_INIT    0xffffffff
39 #define CRC32_POSIX_POLY       0x04c11db7
40 #define CRC32_POSIX_INIT       0
41 
42 //----------------------------------------------------------------------------
43 // Type definition
44 //----------------------------------------------------------------------------
45 
46 
47 //! @name CRC
48 //@{
49 
50 /*!
51     //brief    CRC-8 を計算するために使用するコンテキスト構造体です。
52 
53     @see Crc8Init, Crc8Update, Crc8GetHash
54  */
55 typedef u8 Crc8Context;
56 
57 /*!
58     //brief    CRC-16、CRC-16/CCITT を計算するために使用するコンテキスト構造体です。
59 
60     @see Crc16Init, Crc16Update, Crc16GetHash
61     @see Crc16CcittInit, Crc16CcittUpdate, Crc16CcittGetHash
62  */
63 typedef u16 Crc16Context;
64 
65 /*!
66     //brief    CRC-32、CRC-32/POSIX を計算するために使用するコンテキスト構造体です。
67 
68     @see Crc32Init, Crc32Update, Crc32GetHash
69     @see Crc32PosixInit, Crc32PosixUpdate, Crc32PosixGetHash
70  */
71 typedef u32 Crc32Context;
72 
73 /*!
74     //brief    CRC-8 を計算するために使用するテーブルのための構造体です。
75 
76     @see Crc8InitTable, Crc8Init, Crc8Update, Crc8GetHash
77  */
78 typedef struct Crc8Table
79 {
80     //! テーブルデータ
81     u8      table[256];
82 }
83 Crc8Table;
84 
85 /*!
86     //brief    CRC-16、CRC-16/CCITT を計算するために使用するテーブルのための構造体です。
87 
88     @see Crc16InitTable, Crc16Init, Crc16Update, Crc16GetHash
89     @see Crc16CcittInitTable, Crc16CcittInit, Crc16CcittUpdate, Crc16CcittGetHash
90 */
91 typedef struct Crc16Table
92 {
93     //! テーブルデータ
94     u16     table[256];
95 }
96 Crc16Table;
97 
98 /*!
99     //brief    CRC-32、CRC-32/POSIX を計算するために使用するテーブルのための構造体です。
100 
101     @see Crc32InitTable, Crc32Init, Crc32Update, Crc32GetHash
102     @see Crc32PosixInitTable, Crc32PosixInit, Crc32PosixUpdate, Crc32PosixGetHash
103  */
104 typedef struct Crc32Table
105 {
106     //! テーブルデータ
107     u32     table[256];
108 }
109 Crc32Table;
110 
111 //@}
112 
113 //----------------------------------------------------------------------------
114 // Declaration of function
115 //----------------------------------------------------------------------------
116 
117 //----------------------------------------------------------------------------
118 // Implementation of inline function
119 //----------------------------------------------------------------------------
120 
121 /*****************************************************************************/
122 /* CRC-8 共通                                                               */
123 /*****************************************************************************/
124 
125 /*---------------------------------------------------------------------------*
126   Name:         iCrc8InitTable
127 
128   Description:  CRC-8 値を求めるために使う Crc8Table 構造体を初期化する。
129 
130   Arguments:    table Crc8Table 構造体
131                 poly  生成多項式のビット表現から最上位ビットを除いた数
132 
133   Returns:      None.
134  *---------------------------------------------------------------------------*/
135 void iCrc8InitTable(Crc8Table* table, u8 poly);
136 
137 /*---------------------------------------------------------------------------*
138   Name:         iCrc8InitTableRev
139 
140   Description:  CRC-8 値を求めるために使う Crc8Table 構造体を初期化する。
141                 下位ビットを上位の桁として扱う。
142 
143   Arguments:    table Crc8Table 構造体
144                 poly  生成多項式のビット表現から最上位ビットを除いた数を
145                       上下反転させたもの
146 
147   Returns:      None.
148  *---------------------------------------------------------------------------*/
149 void iCrc8InitTableRev(Crc8Table* table, u8 poly);
150 
151 /*---------------------------------------------------------------------------*
152   Name:         iCrc8Init
153 
154   Description:  CRC-8 値を求めるために使う Crc8Context 構造体を初期化する。
155 
156   Arguments:    context Crc8Context 構造体
157                 init    Crc の初期値
158 
159   Returns:      None.
160  *---------------------------------------------------------------------------*/
iCrc8Init(Crc8Context * context,u8 init)161 inline void iCrc8Init(Crc8Context* context, u8 init)
162 {
163     *context = init;
164 }
165 
166 /*---------------------------------------------------------------------------*
167   Name:         iCrc8Update
168 
169   Description:  CRC-8 値を与えたデータで更新する。
170 
171   Arguments:    table   計算用のテーブル Crc8Table へのポインタ
172                 context Crc8Context 構造体
173                 input   入力データへのポインタ
174                 length  入力データ長
175 
176   Returns:      None.
177  *---------------------------------------------------------------------------*/
178 void iCrc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length);
179 
180 /*---------------------------------------------------------------------------*
181   Name:         iCrc8UpdateRev
182 
183   Description:  CRC-8 値を与えたデータで更新する。
184                 下位ビットを上位の桁として扱う。
185 
186   Arguments:    table   計算用のテーブル Crc8Table へのポインタ
187                 context Crc8Context 構造体
188                 input   入力データへのポインタ
189                 length  入力データ長
190 
191   Returns:      None.
192  *---------------------------------------------------------------------------*/
iCrc8UpdateRev(const Crc8Table * table,Crc8Context * context,const void * input,u32 length)193 inline void iCrc8UpdateRev(const Crc8Table* table, Crc8Context* context, const void* input, u32 length)
194 {
195     iCrc8Update(table, context, input, length);
196 }
197 
198 /*---------------------------------------------------------------------------*
199   Name:         iCrc8GetHash
200 
201   Description:  最終的な CRC-8 値を得る。
202 
203   Arguments:    context Crc8Context 構造体
204 
205   Returns:      計算結果.
206  *---------------------------------------------------------------------------*/
iCrc8GetHash(Crc8Context * context)207 inline u8 iCrc8GetHash(Crc8Context* context)
208 {
209     return (u8)*context;
210 }
211 
212 /*****************************************************************************/
213 /* CRC-8                                                                    */
214 /*****************************************************************************/
215 
216 //! @name CRC
217 //@{
218 
219 /*!
220     //brief
221 
222     CRC-8 値を求めるために使う Crc8Table 構造体を初期化します。
223 
224     @param[out]    table  初期化する CRC-8 計算用のテーブルのポインタ
225 
226  */
227 void Crc8InitTable(Crc8Table* table);
228 
Crc8InitTable(Crc8Table * table)229 inline void Crc8InitTable(Crc8Table* table)
230 {
231     iCrc8InitTable(table, CRC8_STANDARD_POLY);
232 }
233 
234 /*!
235     //brief
236 
237     CRC-8 値を求めるために使う @ref Crc8Context 構造体を初期化します。
238 
239     @param[out]    context  初期化する CRC-8 計算用のコンテキスト構造体へのポインタ
240 
241  */
242 void Crc8Init(Crc8Context* context);
243 
Crc8Init(Crc8Context * context)244 inline void Crc8Init(Crc8Context* context)
245 {
246     iCrc8Init(context, CRC8_STANDARD_INIT);
247 }
248 
249 /*!
250     //brief
251 
252     CRC-8 値を与えたデータで更新します。
253 
254     @param[in]    table   CRC-8 計算用のテーブルへのポインタ
255     @param[in]    context CRC-8 計算用のコンテキスト構造体へのポインタ
256     @param[in]    input   入力データへのポインタ
257     @param[in]    length  入力データのサイズ
258 
259  */
260 void Crc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length);
261 
Crc8Update(const Crc8Table * table,Crc8Context * context,const void * input,u32 length)262 inline void Crc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length)
263 {
264     iCrc8Update(table, context, input, length);
265 }
266 
267 /*!
268     //brief
269 
270     CRC-8 によるハッシュ値を得ます。
271 
272     @param[in]    context CRC-8 生成用のコンテキスト構造体へのポインタ
273 
274     @return       CRC-8の計算結果
275  */
276 u8 Crc8GetHash(Crc8Context* context);
277 
Crc8GetHash(Crc8Context * context)278 inline u8 Crc8GetHash(Crc8Context* context)
279 {
280     return iCrc8GetHash(context);
281 }
282 
283 /*****************************************************************************/
284 /* CRC-16 共通                                                               */
285 /*****************************************************************************/
286 
287 /*---------------------------------------------------------------------------*
288   Name:         iCrc16InitTable
289 
290   Description:  CRC-16 値を求めるために使う Crc16Table 構造体を初期化する。
291 
292   Arguments:    table Crc16Table 構造体
293                 poly  生成多項式のビット表現から最上位ビットを除いた数
294 
295   Returns:      None.
296  *---------------------------------------------------------------------------*/
297 void iCrc16InitTable(Crc16Table* table, u16 poly);
298 
299 /*---------------------------------------------------------------------------*
300   Name:         iCrc16InitTableRev
301 
302   Description:  CRC-16 値を求めるために使う Crc16Table 構造体を初期化する。
303                 下位ビットを上位の桁として扱う。
304 
305   Arguments:    table Crc16Table 構造体
306                 poly  生成多項式のビット表現から最上位ビットを除いた数を
307                       上下反転させたもの
308 
309   Returns:      None.
310  *---------------------------------------------------------------------------*/
311 void iCrc16InitTableRev(Crc16Table* table, u16 poly);
312 
313 /*---------------------------------------------------------------------------*
314   Name:         iCrc16Init
315 
316   Description:  CRC-16 値を求めるために使う Crc16Context 構造体を初期化する。
317 
318   Arguments:    context Crc16Context 構造体
319                 init    Crc の初期値
320 
321   Returns:      None.
322  *---------------------------------------------------------------------------*/
iCrc16Init(Crc16Context * context,u16 init)323 inline void iCrc16Init(Crc16Context* context, u16 init)
324 {
325     *context = init;
326 }
327 
328 /*---------------------------------------------------------------------------*
329   Name:         iCrc16Update
330 
331   Description:  CRC-16 値を与えたデータで更新する。
332 
333   Arguments:    table   計算用のテーブル Crc16Table へのポインタ
334                 context Crc16Context 構造体
335                 input   入力データへのポインタ
336                 length  入力データ長
337 
338   Returns:      None.
339  *---------------------------------------------------------------------------*/
340 void iCrc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length);
341 
342 /*---------------------------------------------------------------------------*
343   Name:         iCrc16UpdateRev
344 
345   Description:  CRC-16 値を与えたデータで更新する。
346                 下位ビットを上位の桁として扱う。
347 
348   Arguments:    table   計算用のテーブル Crc16Table へのポインタ
349                 context Crc16Context 構造体
350                 input   入力データへのポインタ
351                 length  入力データ長
352 
353   Returns:      None.
354  *---------------------------------------------------------------------------*/
355 void iCrc16UpdateRev(const Crc16Table* table, Crc16Context* context, const void* input, u32 length);
356 
357 /*---------------------------------------------------------------------------*
358   Name:         iCrc16GetHash
359 
360   Description:  最終的な CRC-16 値を得る。
361 
362   Arguments:    context Crc16Context 構造体
363 
364   Returns:      計算結果.
365  *---------------------------------------------------------------------------*/
iCrc16GetHash(Crc16Context * context)366 inline u16 iCrc16GetHash(Crc16Context* context)
367 {
368     return (u16)*context;
369 }
370 
371 /*****************************************************************************/
372 /* Crc-16/CCITT(X.25)                                                        */
373 /*****************************************************************************/
374 
375 /*!
376     //brief
377 
378     CRC-16/CCITT 値を求めるために使う Crc16Table 構造体を初期化します。
379 
380     @param[out]    table 初期化する CRC-16/CCITT 計算用のテーブルのポインタ
381 
382  */
383 void Crc16CcittInitTable(Crc16Table* table);
384 
Crc16CcittInitTable(Crc16Table * table)385 inline void Crc16CcittInitTable(Crc16Table* table)
386 {
387     iCrc16InitTable(table, CRC16_CCITT_POLY);
388 }
389 
390 /*!
391     //brief
392 
393     CRC-16/CCITT 値を求めるために使う @ref Crc16Context 構造体を初期化します。
394 
395     @param[out]    context 初期化する CRC-16/CCITT 計算用のコンテキスト構造体へのポインタ
396 
397  */
398 void Crc16CcittInit(Crc16Context* context);
399 
Crc16CcittInit(Crc16Context * context)400 inline void Crc16CcittInit(Crc16Context* context)
401 {
402     iCrc16Init(context, CRC16_CCITT_INIT);
403 }
404 
405 /*!
406     //brief
407 
408   CRC-16/CCITT 値を与えたデータで更新します。
409 
410     @param[in]    table   CRC-16/CCITT 計算用のテーブルへのポインタ
411     @param[in]    context CRC-16/CCITT 計算用のコンテキスト構造体へのポインタ
412     @param[in]    input   入力データへのポインタ
413     @param[in]    length  入力データのサイズ
414 
415  */
416 void Crc16CcittUpdate(const Crc16Table* table, Crc16Context* context, const void* input, u32 length);
417 
Crc16CcittUpdate(const Crc16Table * table,Crc16Context * context,const void * input,u32 length)418 inline void Crc16CcittUpdate(const Crc16Table* table, Crc16Context* context, const void* input, u32 length)
419 {
420     iCrc16Update(table, context, input, length);
421 }
422 
423 /*!
424     //brief
425 
426     CRC-16/CCITT によるハッシュ値を得ます。
427 
428     @param[in]    context CRC-16/CCITT 生成用のコンテキスト構造体へのポインタ
429 
430     @return       CRC-16/CCITTの計算結果
431  */
432 u16 Crc16CcittGetHash(Crc16Context* context);
433 
Crc16CcittGetHash(Crc16Context * context)434 inline u16 Crc16CcittGetHash(Crc16Context* context)
435 {
436     return iCrc16GetHash(context);
437 }
438 
439 /*****************************************************************************/
440 /* CRC-16                                                                    */
441 /*****************************************************************************/
442 
443 /*!
444     //brief
445 
446     CRC-16 値を求めるために使う Crc16Table 構造体を初期化します。
447 
448     @param[out]    table 初期化する CRC-16 計算用のテーブルのポインタ
449 
450  */
451 void Crc16InitTable(Crc16Table* table);
452 
Crc16InitTable(Crc16Table * table)453 inline void Crc16InitTable(Crc16Table* table)
454 {
455     iCrc16InitTableRev(table, CRC16_STANDARD_POLY);
456 }
457 
458 /*!
459     //brief
460 
461     CRC-16 値を求めるために使う @ref Crc16Context 構造体を初期化します。
462 
463     @param[out]    context 初期化する CRC-16 計算用のコンテキスト構造体へのポインタ。
464 
465  */
466 void Crc16Init(Crc16Context* context);
467 
Crc16Init(Crc16Context * context)468 inline void Crc16Init(Crc16Context* context)
469 {
470     iCrc16Init(context, CRC16_STANDARD_INIT);
471 }
472 
473 /*!
474     //brief
475 
476     CRC-16 値を与えたデータで更新します。
477 
478     @param[in]    table   CRC-16 計算用のテーブルへのポインタ
479     @param[in]    context CRC-16 計算用のコンテキスト構造体へのポインタ
480     @param[in]    input   入力データへのポインタ
481     @param[in]    length  入力データのサイズ
482 
483  */
484 void Crc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length);
485 
Crc16Update(const Crc16Table * table,Crc16Context * context,const void * input,u32 length)486 inline void Crc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length)
487 {
488     iCrc16UpdateRev(table, context, input, length);
489 }
490 
491 /*!
492     //brief
493 
494     CRC-16 によるハッシュ値を得ます。
495 
496     @param[in]    context CRC-16 生成用のコンテキスト構造体へのポインタ
497 
498     @return       CRC-16の計算結果
499  */
500 u16 Crc16GetHash(Crc16Context* context);
501 
Crc16GetHash(Crc16Context * context)502 inline u16 Crc16GetHash(Crc16Context* context)
503 {
504     return iCrc16GetHash(context);
505 }
506 
507 /*****************************************************************************/
508 /* CRC-32 共通                                                               */
509 /*****************************************************************************/
510 
511 /*---------------------------------------------------------------------------*
512   Name:         iCrc32InitTable
513 
514   Description:  CRC-32 値を求めるために使う Crc32Table 構造体を初期化する。
515 
516   Arguments:    table Crc32Table 構造体
517                 poly  生成多項式のビット表現から最上位ビットを除いた数
518 
519   Returns:      None.
520  *---------------------------------------------------------------------------*/
521 void iCrc32InitTable(Crc32Table* table, u32 poly);
522 
523 /*---------------------------------------------------------------------------*
524   Name:         iCrc16InitTableRev
525 
526   Description:  CRC-32 値を求めるために使う Crc16Table 構造体を初期化する。
527                 下位ビットを上位の桁として扱う。
528 
529   Arguments:    table Crc16Table 構造体
530                 poly  生成多項式のビット表現から最上位ビットを除いた数を
531                       上下反転させたもの
532 
533   Returns:      None.
534  *---------------------------------------------------------------------------*/
535 void iCrc32InitTableRev(Crc32Table* table, u32 poly);
536 
537 /*---------------------------------------------------------------------------*
538   Name:         iCrc32Init
539 
540   Description:  CRC-32 値を求めるために使う Crc32Context 構造体を初期化する。
541 
542   Arguments:    context Crc32Context 構造体
543                 init    Crc の初期値
544 
545   Returns:      None.
546  *---------------------------------------------------------------------------*/
iCrc32Init(Crc32Context * context,u32 init)547 inline void iCrc32Init(Crc32Context* context, u32 init)
548 {
549     *context = init;
550 }
551 
552 /*---------------------------------------------------------------------------*
553   Name:         iCrc32Update
554 
555   Description:  CRC-32 値を与えたデータで更新する。
556 
557   Arguments:    table   計算用のテーブル Crc32Table へのポインタ
558                 context Crc32Context 構造体
559                 input   入力データへのポインタ
560                 length  入力データ長
561 
562   Returns:      None.
563  *---------------------------------------------------------------------------*/
564 void iCrc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length);
565 
566 /*---------------------------------------------------------------------------*
567   Name:         iCrc32UpdateRev
568 
569   Description:  CRC-32 値を与えたデータで更新する。
570                 下位ビットを上位の桁として扱う。
571 
572   Arguments:    table   計算用のテーブル Crc32Table へのポインタ
573                 context Crc32Context 構造体
574                 input   入力データへのポインタ
575                 length  入力データ長
576 
577   Returns:      None.
578  *---------------------------------------------------------------------------*/
579 void iCrc32UpdateRev(const Crc32Table* table, Crc32Context* context, const void* input, u32 length);
580 
581 /*---------------------------------------------------------------------------*
582   Name:         iCrc32GetHash
583 
584   Description:  最終的な CRC-32 値を得る。
585 
586   Arguments:    context Crc32Context 構造体
587 
588   Returns:      計算結果.
589  *---------------------------------------------------------------------------*/
iCrc32GetHash(Crc32Context * context)590 inline u32 iCrc32GetHash(Crc32Context* context)
591 {
592     return (u32)*context;
593 }
594 
595 /*****************************************************************************/
596 /* CRC-32                                                                    */
597 /*****************************************************************************/
598 
599 /*!
600     //brief
601 
602     CRC-32 値を求めるために使う Crc32Table 構造体を初期化します。
603 
604     @param[out]    table 初期化する CRC-32 計算用のテーブルのポインタ
605 
606  */
607 void Crc32InitTable(Crc32Table* table);
608 
Crc32InitTable(Crc32Table * table)609 inline void Crc32InitTable(Crc32Table* table)
610 {
611     iCrc32InitTableRev(table, CRC32_STANDARD_POLY);
612 }
613 
614 /*!
615     //brief
616 
617     CRC-32 値を求めるために使う @ref Crc32Context 構造体を初期化します。
618 
619     @param[out]    context  初期化する CRC-32 計算用のコンテキスト構造体へのポインタ。
620 
621  */
622 void Crc32Init(Crc32Context* context);
623 
Crc32Init(Crc32Context * context)624 inline void Crc32Init(Crc32Context* context)
625 {
626     iCrc32Init(context, CRC32_STANDARD_INIT);
627 }
628 
629 /*!
630     //brief
631 
632     CRC-32 値を与えたデータで更新します。
633 
634     @param[in]    table   CRC-32 計算用のテーブルへのポインタ
635     @param[in]    context CRC-32 計算用のコンテキスト構造体へのポインタ
636     @param[in]    input   入力データへのポインタ
637     @param[in]    length  入力データのサイズ
638 
639  */
640 void Crc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length);
641 
Crc32Update(const Crc32Table * table,Crc32Context * context,const void * input,u32 length)642 inline void Crc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length)
643 {
644     iCrc32UpdateRev(table, context, input, length);
645 }
646 
647 /*!
648     //brief
649 
650     CRC-32 によるハッシュ値を得ます。
651 
652     @param[in]    context CRC-32 生成用のコンテキスト構造体へのポインタ
653 
654     @return       CRC-32の計算結果
655  */
656 u32 Crc32GetHash(Crc32Context* context);
657 
Crc32GetHash(Crc32Context * context)658 inline u32 Crc32GetHash(Crc32Context* context)
659 {
660     return (u32)(~iCrc32GetHash(context));
661 }
662 
663 /*****************************************************************************/
664 /* CRC-32/POSIX 1003.2                                                       */
665 /*****************************************************************************/
666 
667 /*!
668     //brief
669 
670     CRC-32/POSIX 値を求めるために使う Crc32Table 構造体を初期化します。
671 
672     @param[out]    table 初期化する CRC-32/POSIX 計算用のテーブルのポインタ
673 
674  */
675 void Crc32PosixInitTable(Crc32Table* table);
676 
Crc32PosixInitTable(Crc32Table * table)677 inline void Crc32PosixInitTable(Crc32Table* table)
678 {
679     iCrc32InitTable(table, CRC32_POSIX_POLY);
680 }
681 
682 /*!
683     //brief
684 
685     CRC-32/POSIX 値を求めるために使う @ref Crc32Context 構造体を初期化します。
686 
687     @param[out]    context  初期化する CRC-32/POSIX 計算用のコンテキスト構造体へのポインタ。
688 
689  */
690 void Crc32PosixInit(Crc32Context* context);
691 
Crc32PosixInit(Crc32Context * context)692 inline void Crc32PosixInit(Crc32Context* context)
693 {
694     iCrc32Init(context, CRC32_POSIX_INIT);
695 }
696 
697 /*!
698     //brief
699 
700     CRC-32/POSIX 値を与えたデータで更新します。
701 
702     @param[in]    table   CRC-32/POSIX 計算用のテーブルへのポインタ
703     @param[in]    context CRC-32/POSIX 計算用のコンテキスト構造体へのポインタ
704     @param[in]    input   入力データへのポインタ
705     @param[in]    length  入力データのサイズ
706 
707  */
708 void Crc32PosixUpdate(const Crc32Table* table, Crc32Context* context, const void* input, u32 length);
709 
Crc32PosixUpdate(const Crc32Table * table,Crc32Context * context,const void * input,u32 length)710 inline void Crc32PosixUpdate(const Crc32Table* table, Crc32Context* context, const void* input, u32 length)
711 {
712     iCrc32Update(table, context, input, length);
713 }
714 
715 /*!
716     //brief
717 
718     CRC-32/POSIX によるハッシュ値を得ます。
719 
720     @param[in]    context CRC-32/POSIX 生成用のコンテキスト構造体へのポインタ
721 
722     @return       CRC-32/POSIXの計算結果
723  */
724 u32 Crc32PosixGetHash(Crc32Context* context);
725 
Crc32PosixGetHash(Crc32Context * context)726 inline u32 Crc32PosixGetHash(Crc32Context* context)
727 {
728     return (u32)(~iCrc32GetHash(context));
729 }
730 
731 
732 /*****************************************************************************/
733 /* ユーティリティ関数                                                        */
734 /*****************************************************************************/
735 
736 /*!
737     //brief
738 
739     CRC-8 値を計算します。
740 
741     @param[in]    table   CRC-8 計算用のテーブルへのポインタ
742     @param[in]    data    入力データのポインタ
743     @param[in]    dataLength  入力データのサイズ
744 
745     @return       CRC-8の計算結果
746  */
747 u8 CalcCrc8(const Crc8Table* table, const void* data, u32 dataLength);
748 
749 /*!
750     //brief
751 
752     CRC-16 値を計算します。
753 
754     @param[in]    table   CRC-16 計算用のテーブルへのポインタ
755     @param[in]    data    入力データのポインタ
756     @param[in]    dataLength  入力データのサイズ
757 
758     @return       CRC-16の計算結果
759  */
760 u16 CalcCrc16(const Crc16Table* table, const void* data, u32 dataLength);
761 
762 /*!
763     //brief
764 
765     CRC-16/CCITT 値を計算します。
766 
767     @param[in]    table   CRC-16/CCITT 計算用のテーブルへのポインタ
768     @param[in]    data    入力データのポインタ
769     @param[in]    data    入力データのポインタ
770     @param[in]    dataLength  入力データのサイズ
771 
772     @return       CRC-16/CCITTの計算結果
773  */
774 u16 CalcCrc16Ccitt(const Crc16Table* table, const void* data, u32 dataLength);
775 
776 /*!
777     //brief
778 
779     CRC-32 値を計算します。
780 
781     @param[in]    table   CRC-32 計算用のテーブルへのポインタ
782     @param[in]    data    入力データのポインタ
783     @param[in]    dataLength  入力データのサイズ
784 
785     @return       CRC-32の計算結果
786  */
787 u32 CalcCrc32(const Crc32Table* table, const void* data, u32 dataLength);
788 
789 /*!
790     //brief
791 
792     CRC-32/POSIX 値を計算します。
793 
794     @param[in]    table   CRC-32/POSIX 計算用のテーブルへのポインタ
795     @param[in]    data    入力データのポインタ
796     @param[in]    dataLength  入力データのサイズ
797 
798     @return       CRC-32/POSIXの計算結果
799  */
800 u32 CalcCrc32Posix(const Crc32Table* table, const void* data, u32 dataLength);
801 
802 //@}
803 
804 }}
805 
806 #endif // __cplusplus
807 
808 #endif // ifndef NN_UTIL_UTIL_CRC_H_
809