/*---------------------------------------------------------------------------* 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: 31343 $ *---------------------------------------------------------------------------*/ #ifndef NN_UTIL_UTIL_CRC_H_ #define NN_UTIL_UTIL_CRC_H_ #include #ifdef __cplusplus namespace nn { namespace util { const size_t CRC_TABLE_SIZE = 256; //---------------------------------------------------------------------------- // CRC-8 //---------------------------------------------------------------------------- //! @brief CRC-8 を計算するためのクラスです。 class Crc8 { public: //! @brief デフォルトコンストラクタです。 Crc8(); /*! @brief CRC-8 ハッシュ計算を行うためのコンテキストを初期化します。 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 */ void InitializeContext(u8 context = CRC8_STANDARD_INIT); //! @brief CRC-8 ハッシュ値を入力データで更新します。 //! @param[in] input 入力データへのポインタ //! @param[in] length 入力データのサイズ void Update(const void* input, size_t length); //! @brief 最終的な CRC-8 ハッシュ計算結果を取得します。 //! @return 計算結果 u8 GetHash(); /*! @brief CRC-8 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 @return 計算結果 */ static u8 Calculate(const void* input, size_t length, u8 context = CRC8_STANDARD_INIT); private: //! @brief 生成多項式です。 static const u8 CRC8_STANDARD_POLY = 0x07; //! @brief コンテキストの初期値です。 static const u8 CRC8_STANDARD_INIT = 0; //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 typedef u8 Context; //! @brief ハッシュ計算を行うためのテーブルの構造体です。 struct Table { u8 table[CRC_TABLE_SIZE]; }; //! @brief ハッシュ計算を行うためのコンテキストです。 Context m_Context; //! @brief ハッシュ計算を行うためのテーブルです。 Table m_Table; //! @brief ハッシュ計算を行うためのテーブルを初期化します。 //! @param[in] poly テーブルを初期化するための生成多項式 void InitializeTable(u8 poly); }; //---------------------------------------------------------------------------- // CRC-16 //---------------------------------------------------------------------------- //! @brief CRC-16 を計算するためのクラスです。 class Crc16 { public: //! @brief デフォルトコンストラクタです。 Crc16(); //! @brief CRC-16 ハッシュ計算を行うためのコンテキストを初期化します。 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 void InitializeContext(u16 context = CRC16_STANDARD_INIT); //! @brief CRC-16 ハッシュ値を入力データで更新します。 //! @param[in] input 入力データへのポインタ //! @param[in] length 入力データのサイズ void Update(const void* input, size_t length); //! @brief 最終的な CRC-16 ハッシュ計算結果を取得します。 //! @return 計算結果 u16 GetHash(); /*! @brief CRC-16 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 @return 計算結果 */ static u16 Calculate(const void* input, size_t length, u16 context = CRC16_STANDARD_INIT); private: //! @brief 生成多項式です。 static const u16 CRC16_STANDARD_POLY = 0xa001; // ビット反転するものは生成多項式も反転 //! @brief コンテキストの初期値です。 static const u16 CRC16_STANDARD_INIT = 0; //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 typedef u16 Context; //! @brief ハッシュ計算を行うためのテーブルの構造体です。 struct Table { u16 table[CRC_TABLE_SIZE]; }; //! @brief ハッシュ計算を行うためのコンテキストです。 Context m_Context; //! @brief ハッシュ計算を行うためのテーブルです。 Table m_Table; //! @brief ハッシュ計算を行うためのテーブルを初期化します。 //! @param[in] poly テーブルを初期化するための生成多項式 void InitializeTable(u16 poly); }; //---------------------------------------------------------------------------- // CRC-16/CCITT //---------------------------------------------------------------------------- //! @brief CRC-16/CCITT を計算するためのクラスです。 class Crc16Ccitt { public: //! @brief デフォルトコンストラクタです。 Crc16Ccitt(); //! @brief CRC-16/CCITT ハッシュ計算を行うためのコンテキストを初期化します。 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 void InitializeContext(u16 context = CRC16_CCITT_INIT); //! @brief CRC-16/CCITT ハッシュ値を入力データで更新します。 //! @param[in] input 入力データへのポインタ //! @param[in] length 入力データのサイズ void Update(const void* input, size_t length); //! @brief 最終的な CRC-16/CCITT ハッシュ計算結果を取得します。 //! @return 計算結果 u16 GetHash(); /*! @brief CRC-16/CCITT を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 @return 計算結果 */ static u16 Calculate(const void* input, size_t length, u16 context = CRC16_CCITT_INIT); private: //! @brief 生成多項式です。 static const u16 CRC16_CCITT_POLY = 0x1021; //! @brief コンテキストの初期値です。 static const u16 CRC16_CCITT_INIT = 0xffff; //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 typedef u16 Context; //! @brief ハッシュ計算を行うためのテーブルの構造体です。 struct Table { u16 table[CRC_TABLE_SIZE]; }; //! @brief ハッシュ計算を行うためのコンテキストです。 Context m_Context; //! @brief ハッシュ計算を行うためのテーブルです。 Table m_Table; //! @brief ハッシュ計算を行うためのテーブルを初期化します。 //! @param[in] poly テーブルを初期化するための生成多項式 void InitializeTable(u16 poly); }; //---------------------------------------------------------------------------- // CRC-32 //---------------------------------------------------------------------------- //! @brief CRC-32 を計算するためのクラスです。 class Crc32 { public: //! @brief デフォルトコンストラクタです。 Crc32(); //! @brief CRC-32 ハッシュ計算を行うためのコンテキストを初期化します。 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 void InitializeContext(u32 context = CRC32_STANDARD_INIT); //! @brief CRC-32 ハッシュ値を入力データで更新します。 //! @param[in] input 入力データへのポインタ //! @param[in] length 入力データのサイズ void Update(const void* input, size_t length); //! @brief 最終的な CRC-32 ハッシュ計算結果を取得します。 //! @return 計算結果 u32 GetHash(); /*! @brief CRC-32 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 @return 計算結果 */ static u32 Calculate(const void* input, size_t length, u32 context = CRC32_STANDARD_INIT); private: //! @brief 生成多項式です。 static const u32 CRC32_STANDARD_POLY = 0xedb88320; // ビット反転するものは生成多項式も反転 //! @brief コンテキストの初期値です。 static const u32 CRC32_STANDARD_INIT = 0xffffffff; //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 typedef u32 Context; //! @brief ハッシュ計算を行うためのテーブルの構造体です。 struct Table { u32 table[CRC_TABLE_SIZE]; }; //! @brief ハッシュ計算を行うためのコンテキストです。 Context m_Context; //! @brief ハッシュ計算を行うためのテーブルです。 Table m_Table; //! @brief ハッシュ計算を行うためのテーブルを初期化します。 //! @param[in] poly テーブルを初期化するための生成多項式 void InitializeTable(u32 poly); }; //---------------------------------------------------------------------------- // CRC-32/POSIX //---------------------------------------------------------------------------- //! @brief CRC-32/POSIX を計算するためのクラスです。 class Crc32Posix { public: //! @brief デフォルトコンストラクタです。 Crc32Posix(); //! @brief CRC-32/POSIX ハッシュ計算を行うためのコンテキストを初期化します。 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 void InitializeContext(u32 context = CRC32_POSIX_INIT); //! @brief CRC-32/POSIX ハッシュ値を入力データで更新します。 //! @param[in] input 入力データへのポインタ //! @param[in] length 入力データのサイズ void Update(const void* input, size_t length); //! @brief 最終的な CRC-32/POSIX ハッシュ計算結果を取得します。 //! @return 計算結果 u32 GetHash(); /*! @brief CRC-32/POSIX を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 @param[in] input 入力データへのポインタ @param[in] length 入力データのサイズ @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 @return 計算結果 */ static u32 Calculate(const void* input, size_t length, u32 context = CRC32_POSIX_INIT); private: //! @brief 生成多項式です。 static const u32 CRC32_POSIX_POLY = 0x04c11db7; //! @brief コンテキストの初期値です。 static const u32 CRC32_POSIX_INIT = 0; //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 typedef u32 Context; //! @brief ハッシュ計算を行うためのテーブルの構造体です。 struct Table { u32 table[CRC_TABLE_SIZE]; }; //! @brief ハッシュ計算を行うためのコンテキストです。 Context m_Context; //! @brief ハッシュ計算を行うためのテーブルです。 Table m_Table; //! @brief ハッシュ計算を行うためのテーブルを初期化します。 //! @param[in] poly テーブルを初期化するための生成多項式 void InitializeTable(u32 poly); }; }} #endif // __cplusplus #endif // ifndef NN_UTIL_UTIL_CRC_H_