/*---------------------------------------------------------------------------* Project: Horizon File: util_Crc.cpp Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 26176 $ *---------------------------------------------------------------------------*/ #ifndef NN_UTIL_UTIL_CRC_H_ #define NN_UTIL_UTIL_CRC_H_ #include #ifdef __cplusplus namespace nn { namespace util { //---------------------------------------------------------------------------- // Constant definition //---------------------------------------------------------------------------- #define CRC8_STANDARD_POLY 0x07 #define CRC8_STANDARD_INIT 0 #define CRC16_STANDARD_POLY 0xa001 // ビット反転するものは生成多項式も反転 #define CRC16_STANDARD_INIT 0 #define CRC16_CCITT_POLY 0x1021 #define CRC16_CCITT_INIT 0xffff #define CRC32_STANDARD_POLY 0xedb88320 // ビット反転するものは生成多項式も反転 #define CRC32_STANDARD_INIT 0xffffffff #define CRC32_POSIX_POLY 0x04c11db7 #define CRC32_POSIX_INIT 0 //---------------------------------------------------------------------------- // Type definition //---------------------------------------------------------------------------- //! @name CRC //@{ /*! //brief CRC-8 を計算するために使用するコンテキスト構造体です。 @see Crc8Init, Crc8Update, Crc8GetHash */ typedef u8 Crc8Context; /*! //brief CRC-16、CRC-16/CCITT を計算するために使用するコンテキスト構造体です。 @see Crc16Init, Crc16Update, Crc16GetHash @see Crc16CcittInit, Crc16CcittUpdate, Crc16CcittGetHash */ typedef u16 Crc16Context; /*! //brief CRC-32、CRC-32/POSIX を計算するために使用するコンテキスト構造体です。 @see Crc32Init, Crc32Update, Crc32GetHash @see Crc32PosixInit, Crc32PosixUpdate, Crc32PosixGetHash */ typedef u32 Crc32Context; /*! //brief CRC-8 を計算するために使用するテーブルのための構造体です。 @see Crc8InitTable, Crc8Init, Crc8Update, Crc8GetHash */ typedef struct Crc8Table { //! テーブルデータ u8 table[256]; } Crc8Table; /*! //brief CRC-16、CRC-16/CCITT を計算するために使用するテーブルのための構造体です。 @see Crc16InitTable, Crc16Init, Crc16Update, Crc16GetHash @see Crc16CcittInitTable, Crc16CcittInit, Crc16CcittUpdate, Crc16CcittGetHash */ typedef struct Crc16Table { //! テーブルデータ u16 table[256]; } Crc16Table; /*! //brief CRC-32、CRC-32/POSIX を計算するために使用するテーブルのための構造体です。 @see Crc32InitTable, Crc32Init, Crc32Update, Crc32GetHash @see Crc32PosixInitTable, Crc32PosixInit, Crc32PosixUpdate, Crc32PosixGetHash */ typedef struct Crc32Table { //! テーブルデータ u32 table[256]; } Crc32Table; //@} //---------------------------------------------------------------------------- // Declaration of function //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // Implementation of inline function //---------------------------------------------------------------------------- /*****************************************************************************/ /* CRC-8 共通 */ /*****************************************************************************/ /*---------------------------------------------------------------------------* Name: iCrc8InitTable Description: CRC-8 値を求めるために使う Crc8Table 構造体を初期化する。 Arguments: table Crc8Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数 Returns: None. *---------------------------------------------------------------------------*/ void iCrc8InitTable(Crc8Table* table, u8 poly); /*---------------------------------------------------------------------------* Name: iCrc8InitTableRev Description: CRC-8 値を求めるために使う Crc8Table 構造体を初期化する。 下位ビットを上位の桁として扱う。 Arguments: table Crc8Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数を 上下反転させたもの Returns: None. *---------------------------------------------------------------------------*/ void iCrc8InitTableRev(Crc8Table* table, u8 poly); /*---------------------------------------------------------------------------* Name: iCrc8Init Description: CRC-8 値を求めるために使う Crc8Context 構造体を初期化する。 Arguments: context Crc8Context 構造体 init Crc の初期値 Returns: None. *---------------------------------------------------------------------------*/ inline void iCrc8Init(Crc8Context* context, u8 init) { *context = init; } /*---------------------------------------------------------------------------* Name: iCrc8Update Description: CRC-8 値を与えたデータで更新する。 Arguments: table 計算用のテーブル Crc8Table へのポインタ context Crc8Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ void iCrc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length); /*---------------------------------------------------------------------------* Name: iCrc8UpdateRev Description: CRC-8 値を与えたデータで更新する。 下位ビットを上位の桁として扱う。 Arguments: table 計算用のテーブル Crc8Table へのポインタ context Crc8Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ inline void iCrc8UpdateRev(const Crc8Table* table, Crc8Context* context, const void* input, u32 length) { iCrc8Update(table, context, input, length); } /*---------------------------------------------------------------------------* Name: iCrc8GetHash Description: 最終的な CRC-8 値を得る。 Arguments: context Crc8Context 構造体 Returns: 計算結果. *---------------------------------------------------------------------------*/ inline u8 iCrc8GetHash(Crc8Context* context) { return (u8)*context; } /*****************************************************************************/ /* CRC-8 */ /*****************************************************************************/ //! @name CRC //@{ /*! //brief CRC-8 値を求めるために使う Crc8Table 構造体を初期化します。 @param[out] table 初期化する CRC-8 計算用のテーブルのポインタ */ void Crc8InitTable(Crc8Table* table); inline void Crc8InitTable(Crc8Table* table) { iCrc8InitTable(table, CRC8_STANDARD_POLY); } /*! //brief CRC-8 値を求めるために使う @ref Crc8Context 構造体を初期化します。 @param[out] context 初期化する CRC-8 計算用のコンテキスト構造体へのポインタ */ void Crc8Init(Crc8Context* context); inline void Crc8Init(Crc8Context* context) { iCrc8Init(context, CRC8_STANDARD_INIT); } /*! //brief CRC-8 値を与えたデータで更新します。 @param[in] table CRC-8 計算用のテーブルへのポインタ @param[in] context CRC-8 計算用のコンテキスト構造体へのポインタ @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ */ void Crc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length); inline void Crc8Update(const Crc8Table* table, Crc8Context* context, const void* input, u32 length) { iCrc8Update(table, context, input, length); } /*! //brief CRC-8 によるハッシュ値を得ます。 @param[in] context CRC-8 生成用のコンテキスト構造体へのポインタ @return CRC-8の計算結果 */ u8 Crc8GetHash(Crc8Context* context); inline u8 Crc8GetHash(Crc8Context* context) { return iCrc8GetHash(context); } /*****************************************************************************/ /* CRC-16 共通 */ /*****************************************************************************/ /*---------------------------------------------------------------------------* Name: iCrc16InitTable Description: CRC-16 値を求めるために使う Crc16Table 構造体を初期化する。 Arguments: table Crc16Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数 Returns: None. *---------------------------------------------------------------------------*/ void iCrc16InitTable(Crc16Table* table, u16 poly); /*---------------------------------------------------------------------------* Name: iCrc16InitTableRev Description: CRC-16 値を求めるために使う Crc16Table 構造体を初期化する。 下位ビットを上位の桁として扱う。 Arguments: table Crc16Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数を 上下反転させたもの Returns: None. *---------------------------------------------------------------------------*/ void iCrc16InitTableRev(Crc16Table* table, u16 poly); /*---------------------------------------------------------------------------* Name: iCrc16Init Description: CRC-16 値を求めるために使う Crc16Context 構造体を初期化する。 Arguments: context Crc16Context 構造体 init Crc の初期値 Returns: None. *---------------------------------------------------------------------------*/ inline void iCrc16Init(Crc16Context* context, u16 init) { *context = init; } /*---------------------------------------------------------------------------* Name: iCrc16Update Description: CRC-16 値を与えたデータで更新する。 Arguments: table 計算用のテーブル Crc16Table へのポインタ context Crc16Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ void iCrc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length); /*---------------------------------------------------------------------------* Name: iCrc16UpdateRev Description: CRC-16 値を与えたデータで更新する。 下位ビットを上位の桁として扱う。 Arguments: table 計算用のテーブル Crc16Table へのポインタ context Crc16Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ void iCrc16UpdateRev(const Crc16Table* table, Crc16Context* context, const void* input, u32 length); /*---------------------------------------------------------------------------* Name: iCrc16GetHash Description: 最終的な CRC-16 値を得る。 Arguments: context Crc16Context 構造体 Returns: 計算結果. *---------------------------------------------------------------------------*/ inline u16 iCrc16GetHash(Crc16Context* context) { return (u16)*context; } /*****************************************************************************/ /* Crc-16/CCITT(X.25) */ /*****************************************************************************/ /*! //brief CRC-16/CCITT 値を求めるために使う Crc16Table 構造体を初期化します。 @param[out] table 初期化する CRC-16/CCITT 計算用のテーブルのポインタ */ void Crc16CcittInitTable(Crc16Table* table); inline void Crc16CcittInitTable(Crc16Table* table) { iCrc16InitTable(table, CRC16_CCITT_POLY); } /*! //brief CRC-16/CCITT 値を求めるために使う @ref Crc16Context 構造体を初期化します。 @param[out] context 初期化する CRC-16/CCITT 計算用のコンテキスト構造体へのポインタ */ void Crc16CcittInit(Crc16Context* context); inline void Crc16CcittInit(Crc16Context* context) { iCrc16Init(context, CRC16_CCITT_INIT); } /*! //brief CRC-16/CCITT 値を与えたデータで更新します。 @param[in] table CRC-16/CCITT 計算用のテーブルへのポインタ @param[in] context CRC-16/CCITT 計算用のコンテキスト構造体へのポインタ @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ */ void Crc16CcittUpdate(const Crc16Table* table, Crc16Context* context, const void* input, u32 length); inline void Crc16CcittUpdate(const Crc16Table* table, Crc16Context* context, const void* input, u32 length) { iCrc16Update(table, context, input, length); } /*! //brief CRC-16/CCITT によるハッシュ値を得ます。 @param[in] context CRC-16/CCITT 生成用のコンテキスト構造体へのポインタ @return CRC-16/CCITTの計算結果 */ u16 Crc16CcittGetHash(Crc16Context* context); inline u16 Crc16CcittGetHash(Crc16Context* context) { return iCrc16GetHash(context); } /*****************************************************************************/ /* CRC-16 */ /*****************************************************************************/ /*! //brief CRC-16 値を求めるために使う Crc16Table 構造体を初期化します。 @param[out] table 初期化する CRC-16 計算用のテーブルのポインタ */ void Crc16InitTable(Crc16Table* table); inline void Crc16InitTable(Crc16Table* table) { iCrc16InitTableRev(table, CRC16_STANDARD_POLY); } /*! //brief CRC-16 値を求めるために使う @ref Crc16Context 構造体を初期化します。 @param[out] context 初期化する CRC-16 計算用のコンテキスト構造体へのポインタ。 */ void Crc16Init(Crc16Context* context); inline void Crc16Init(Crc16Context* context) { iCrc16Init(context, CRC16_STANDARD_INIT); } /*! //brief CRC-16 値を与えたデータで更新します。 @param[in] table CRC-16 計算用のテーブルへのポインタ @param[in] context CRC-16 計算用のコンテキスト構造体へのポインタ @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ */ void Crc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length); inline void Crc16Update(const Crc16Table* table, Crc16Context* context, const void* input, u32 length) { iCrc16UpdateRev(table, context, input, length); } /*! //brief CRC-16 によるハッシュ値を得ます。 @param[in] context CRC-16 生成用のコンテキスト構造体へのポインタ @return CRC-16の計算結果 */ u16 Crc16GetHash(Crc16Context* context); inline u16 Crc16GetHash(Crc16Context* context) { return iCrc16GetHash(context); } /*****************************************************************************/ /* CRC-32 共通 */ /*****************************************************************************/ /*---------------------------------------------------------------------------* Name: iCrc32InitTable Description: CRC-32 値を求めるために使う Crc32Table 構造体を初期化する。 Arguments: table Crc32Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数 Returns: None. *---------------------------------------------------------------------------*/ void iCrc32InitTable(Crc32Table* table, u32 poly); /*---------------------------------------------------------------------------* Name: iCrc16InitTableRev Description: CRC-32 値を求めるために使う Crc16Table 構造体を初期化する。 下位ビットを上位の桁として扱う。 Arguments: table Crc16Table 構造体 poly 生成多項式のビット表現から最上位ビットを除いた数を 上下反転させたもの Returns: None. *---------------------------------------------------------------------------*/ void iCrc32InitTableRev(Crc32Table* table, u32 poly); /*---------------------------------------------------------------------------* Name: iCrc32Init Description: CRC-32 値を求めるために使う Crc32Context 構造体を初期化する。 Arguments: context Crc32Context 構造体 init Crc の初期値 Returns: None. *---------------------------------------------------------------------------*/ inline void iCrc32Init(Crc32Context* context, u32 init) { *context = init; } /*---------------------------------------------------------------------------* Name: iCrc32Update Description: CRC-32 値を与えたデータで更新する。 Arguments: table 計算用のテーブル Crc32Table へのポインタ context Crc32Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ void iCrc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length); /*---------------------------------------------------------------------------* Name: iCrc32UpdateRev Description: CRC-32 値を与えたデータで更新する。 下位ビットを上位の桁として扱う。 Arguments: table 計算用のテーブル Crc32Table へのポインタ context Crc32Context 構造体 input 入力データへのポインタ length 入力データ長 Returns: None. *---------------------------------------------------------------------------*/ void iCrc32UpdateRev(const Crc32Table* table, Crc32Context* context, const void* input, u32 length); /*---------------------------------------------------------------------------* Name: iCrc32GetHash Description: 最終的な CRC-32 値を得る。 Arguments: context Crc32Context 構造体 Returns: 計算結果. *---------------------------------------------------------------------------*/ inline u32 iCrc32GetHash(Crc32Context* context) { return (u32)*context; } /*****************************************************************************/ /* CRC-32 */ /*****************************************************************************/ /*! //brief CRC-32 値を求めるために使う Crc32Table 構造体を初期化します。 @param[out] table 初期化する CRC-32 計算用のテーブルのポインタ */ void Crc32InitTable(Crc32Table* table); inline void Crc32InitTable(Crc32Table* table) { iCrc32InitTableRev(table, CRC32_STANDARD_POLY); } /*! //brief CRC-32 値を求めるために使う @ref Crc32Context 構造体を初期化します。 @param[out] context 初期化する CRC-32 計算用のコンテキスト構造体へのポインタ。 */ void Crc32Init(Crc32Context* context); inline void Crc32Init(Crc32Context* context) { iCrc32Init(context, CRC32_STANDARD_INIT); } /*! //brief CRC-32 値を与えたデータで更新します。 @param[in] table CRC-32 計算用のテーブルへのポインタ @param[in] context CRC-32 計算用のコンテキスト構造体へのポインタ @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ */ void Crc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length); inline void Crc32Update(const Crc32Table* table, Crc32Context* context, const void* input, u32 length) { iCrc32UpdateRev(table, context, input, length); } /*! //brief CRC-32 によるハッシュ値を得ます。 @param[in] context CRC-32 生成用のコンテキスト構造体へのポインタ @return CRC-32の計算結果 */ u32 Crc32GetHash(Crc32Context* context); inline u32 Crc32GetHash(Crc32Context* context) { return (u32)(~iCrc32GetHash(context)); } /*****************************************************************************/ /* CRC-32/POSIX 1003.2 */ /*****************************************************************************/ /*! //brief CRC-32/POSIX 値を求めるために使う Crc32Table 構造体を初期化します。 @param[out] table 初期化する CRC-32/POSIX 計算用のテーブルのポインタ */ void Crc32PosixInitTable(Crc32Table* table); inline void Crc32PosixInitTable(Crc32Table* table) { iCrc32InitTable(table, CRC32_POSIX_POLY); } /*! //brief CRC-32/POSIX 値を求めるために使う @ref Crc32Context 構造体を初期化します。 @param[out] context 初期化する CRC-32/POSIX 計算用のコンテキスト構造体へのポインタ。 */ void Crc32PosixInit(Crc32Context* context); inline void Crc32PosixInit(Crc32Context* context) { iCrc32Init(context, CRC32_POSIX_INIT); } /*! //brief CRC-32/POSIX 値を与えたデータで更新します。 @param[in] table CRC-32/POSIX 計算用のテーブルへのポインタ @param[in] context CRC-32/POSIX 計算用のコンテキスト構造体へのポインタ @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ */ void Crc32PosixUpdate(const Crc32Table* table, Crc32Context* context, const void* input, u32 length); inline void Crc32PosixUpdate(const Crc32Table* table, Crc32Context* context, const void* input, u32 length) { iCrc32Update(table, context, input, length); } /*! //brief CRC-32/POSIX によるハッシュ値を得ます。 @param[in] context CRC-32/POSIX 生成用のコンテキスト構造体へのポインタ @return CRC-32/POSIXの計算結果 */ u32 Crc32PosixGetHash(Crc32Context* context); inline u32 Crc32PosixGetHash(Crc32Context* context) { return (u32)(~iCrc32GetHash(context)); } /*****************************************************************************/ /* ユーティリティ関数 */ /*****************************************************************************/ /*! //brief CRC-8 値を計算します。 @param[in] table CRC-8 計算用のテーブルへのポインタ @param[in] data 入力データのポインタ @param[in] dataLength 入力データのサイズ @return CRC-8の計算結果 */ u8 CalcCrc8(const Crc8Table* table, const void* data, u32 dataLength); /*! //brief CRC-16 値を計算します。 @param[in] table CRC-16 計算用のテーブルへのポインタ @param[in] data 入力データのポインタ @param[in] dataLength 入力データのサイズ @return CRC-16の計算結果 */ u16 CalcCrc16(const Crc16Table* table, const void* data, u32 dataLength); /*! //brief CRC-16/CCITT 値を計算します。 @param[in] table CRC-16/CCITT 計算用のテーブルへのポインタ @param[in] data 入力データのポインタ @param[in] data 入力データのポインタ @param[in] dataLength 入力データのサイズ @return CRC-16/CCITTの計算結果 */ u16 CalcCrc16Ccitt(const Crc16Table* table, const void* data, u32 dataLength); /*! //brief CRC-32 値を計算します。 @param[in] table CRC-32 計算用のテーブルへのポインタ @param[in] data 入力データのポインタ @param[in] dataLength 入力データのサイズ @return CRC-32の計算結果 */ u32 CalcCrc32(const Crc32Table* table, const void* data, u32 dataLength); /*! //brief CRC-32/POSIX 値を計算します。 @param[in] table CRC-32/POSIX 計算用のテーブルへのポインタ @param[in] data 入力データのポインタ @param[in] dataLength 入力データのサイズ @return CRC-32/POSIXの計算結果 */ u32 CalcCrc32Posix(const Crc32Table* table, const void* data, u32 dataLength); //@} }} #endif // __cplusplus #endif // ifndef NN_UTIL_UTIL_CRC_H_