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: 31343 $ 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 const size_t CRC_TABLE_SIZE = 256; 26 27 //---------------------------------------------------------------------------- 28 // CRC-8 29 //---------------------------------------------------------------------------- 30 31 //! @brief CRC-8 を計算するためのクラスです。 32 class Crc8 { 33 34 public: 35 36 //! @brief デフォルトコンストラクタです。 37 Crc8(); 38 39 /*! 40 @brief CRC-8 ハッシュ計算を行うためのコンテキストを初期化します。 41 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 42 */ 43 void InitializeContext(u8 context = CRC8_STANDARD_INIT); 44 45 //! @brief CRC-8 ハッシュ値を入力データで更新します。 46 //! @param[in] input 入力データへのポインタ 47 //! @param[in] length 入力データのサイズ 48 void Update(const void* input, size_t length); 49 50 //! @brief 最終的な CRC-8 ハッシュ計算結果を取得します。 51 //! @return 計算結果 52 u8 GetHash(); 53 54 /*! 55 @brief 56 57 CRC-8 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 58 59 @param[in] input 入力データへのポインタ 60 @param[in] length 入力データのサイズ 61 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 62 63 @return 計算結果 64 */ 65 static u8 Calculate(const void* input, size_t length, u8 context = CRC8_STANDARD_INIT); 66 67 private: 68 //! @brief 生成多項式です。 69 static const u8 CRC8_STANDARD_POLY = 0x07; 70 71 //! @brief コンテキストの初期値です。 72 static const u8 CRC8_STANDARD_INIT = 0; 73 74 //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 75 typedef u8 Context; 76 77 //! @brief ハッシュ計算を行うためのテーブルの構造体です。 78 struct Table 79 { 80 u8 table[CRC_TABLE_SIZE]; 81 }; 82 83 //! @brief ハッシュ計算を行うためのコンテキストです。 84 Context m_Context; 85 86 //! @brief ハッシュ計算を行うためのテーブルです。 87 Table m_Table; 88 89 //! @brief ハッシュ計算を行うためのテーブルを初期化します。 90 //! @param[in] poly テーブルを初期化するための生成多項式 91 void InitializeTable(u8 poly); 92 93 }; 94 95 //---------------------------------------------------------------------------- 96 // CRC-16 97 //---------------------------------------------------------------------------- 98 99 //! @brief CRC-16 を計算するためのクラスです。 100 class Crc16 { 101 102 public: 103 //! @brief デフォルトコンストラクタです。 104 Crc16(); 105 106 //! @brief CRC-16 ハッシュ計算を行うためのコンテキストを初期化します。 107 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 108 void InitializeContext(u16 context = CRC16_STANDARD_INIT); 109 110 //! @brief CRC-16 ハッシュ値を入力データで更新します。 111 //! @param[in] input 入力データへのポインタ 112 //! @param[in] length 入力データのサイズ 113 void Update(const void* input, size_t length); 114 115 //! @brief 最終的な CRC-16 ハッシュ計算結果を取得します。 116 //! @return 計算結果 117 u16 GetHash(); 118 119 /*! 120 @brief 121 122 CRC-16 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 123 124 @param[in] input 入力データへのポインタ 125 @param[in] length 入力データのサイズ 126 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 127 128 @return 計算結果 129 */ 130 static u16 Calculate(const void* input, size_t length, u16 context = CRC16_STANDARD_INIT); 131 132 private: 133 //! @brief 生成多項式です。 134 static const u16 CRC16_STANDARD_POLY = 0xa001; // ビット反転するものは生成多項式も反転 135 136 //! @brief コンテキストの初期値です。 137 static const u16 CRC16_STANDARD_INIT = 0; 138 139 //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 140 typedef u16 Context; 141 142 //! @brief ハッシュ計算を行うためのテーブルの構造体です。 143 struct Table 144 { 145 u16 table[CRC_TABLE_SIZE]; 146 }; 147 148 //! @brief ハッシュ計算を行うためのコンテキストです。 149 Context m_Context; 150 151 //! @brief ハッシュ計算を行うためのテーブルです。 152 Table m_Table; 153 154 //! @brief ハッシュ計算を行うためのテーブルを初期化します。 155 //! @param[in] poly テーブルを初期化するための生成多項式 156 void InitializeTable(u16 poly); 157 158 }; 159 160 //---------------------------------------------------------------------------- 161 // CRC-16/CCITT 162 //---------------------------------------------------------------------------- 163 164 //! @brief CRC-16/CCITT を計算するためのクラスです。 165 class Crc16Ccitt { 166 167 public: 168 169 //! @brief デフォルトコンストラクタです。 170 Crc16Ccitt(); 171 172 //! @brief CRC-16/CCITT ハッシュ計算を行うためのコンテキストを初期化します。 173 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 174 void InitializeContext(u16 context = CRC16_CCITT_INIT); 175 176 //! @brief CRC-16/CCITT ハッシュ値を入力データで更新します。 177 //! @param[in] input 入力データへのポインタ 178 //! @param[in] length 入力データのサイズ 179 void Update(const void* input, size_t length); 180 181 //! @brief 最終的な CRC-16/CCITT ハッシュ計算結果を取得します。 182 //! @return 計算結果 183 u16 GetHash(); 184 185 /*! 186 @brief 187 188 CRC-16/CCITT を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 189 190 @param[in] input 入力データへのポインタ 191 @param[in] length 入力データのサイズ 192 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 193 194 @return 計算結果 195 */ 196 static u16 Calculate(const void* input, size_t length, u16 context = CRC16_CCITT_INIT); 197 198 private: 199 //! @brief 生成多項式です。 200 static const u16 CRC16_CCITT_POLY = 0x1021; 201 202 //! @brief コンテキストの初期値です。 203 static const u16 CRC16_CCITT_INIT = 0xffff; 204 205 //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 206 typedef u16 Context; 207 208 //! @brief ハッシュ計算を行うためのテーブルの構造体です。 209 struct Table 210 { 211 u16 table[CRC_TABLE_SIZE]; 212 }; 213 214 //! @brief ハッシュ計算を行うためのコンテキストです。 215 Context m_Context; 216 217 //! @brief ハッシュ計算を行うためのテーブルです。 218 Table m_Table; 219 220 221 //! @brief ハッシュ計算を行うためのテーブルを初期化します。 222 //! @param[in] poly テーブルを初期化するための生成多項式 223 void InitializeTable(u16 poly); 224 225 }; 226 227 //---------------------------------------------------------------------------- 228 // CRC-32 229 //---------------------------------------------------------------------------- 230 231 //! @brief CRC-32 を計算するためのクラスです。 232 class Crc32 { 233 234 public: 235 236 //! @brief デフォルトコンストラクタです。 237 Crc32(); 238 239 //! @brief CRC-32 ハッシュ計算を行うためのコンテキストを初期化します。 240 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 241 void InitializeContext(u32 context = CRC32_STANDARD_INIT); 242 243 //! @brief CRC-32 ハッシュ値を入力データで更新します。 244 //! @param[in] input 入力データへのポインタ 245 //! @param[in] length 入力データのサイズ 246 void Update(const void* input, size_t length); 247 248 //! @brief 最終的な CRC-32 ハッシュ計算結果を取得します。 249 //! @return 計算結果 250 u32 GetHash(); 251 252 /*! 253 @brief 254 255 CRC-32 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 256 257 @param[in] input 入力データへのポインタ 258 @param[in] length 入力データのサイズ 259 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 260 261 @return 計算結果 262 */ 263 static u32 Calculate(const void* input, size_t length, u32 context = CRC32_STANDARD_INIT); 264 265 private: 266 //! @brief 生成多項式です。 267 static const u32 CRC32_STANDARD_POLY = 0xedb88320; // ビット反転するものは生成多項式も反転 268 269 //! @brief コンテキストの初期値です。 270 static const u32 CRC32_STANDARD_INIT = 0xffffffff; 271 272 //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 273 typedef u32 Context; 274 275 //! @brief ハッシュ計算を行うためのテーブルの構造体です。 276 struct Table 277 { 278 u32 table[CRC_TABLE_SIZE]; 279 }; 280 281 //! @brief ハッシュ計算を行うためのコンテキストです。 282 Context m_Context; 283 284 //! @brief ハッシュ計算を行うためのテーブルです。 285 Table m_Table; 286 287 288 //! @brief ハッシュ計算を行うためのテーブルを初期化します。 289 //! @param[in] poly テーブルを初期化するための生成多項式 290 void InitializeTable(u32 poly); 291 292 }; 293 294 //---------------------------------------------------------------------------- 295 // CRC-32/POSIX 296 //---------------------------------------------------------------------------- 297 298 //! @brief CRC-32/POSIX を計算するためのクラスです。 299 class Crc32Posix { 300 301 public: 302 303 //! @brief デフォルトコンストラクタです。 304 Crc32Posix(); 305 306 //! @brief CRC-32/POSIX ハッシュ計算を行うためのコンテキストを初期化します。 307 //! @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 308 void InitializeContext(u32 context = CRC32_POSIX_INIT); 309 310 //! @brief CRC-32/POSIX ハッシュ値を入力データで更新します。 311 //! @param[in] input 入力データへのポインタ 312 //! @param[in] length 入力データのサイズ 313 void Update(const void* input, size_t length); 314 315 //! @brief 最終的な CRC-32/POSIX ハッシュ計算結果を取得します。 316 //! @return 計算結果 317 u32 GetHash(); 318 319 /*! 320 @brief 321 322 CRC-32/POSIX を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。 323 324 @param[in] input 入力データへのポインタ 325 @param[in] length 入力データのサイズ 326 @param[in] context コンテキストの初期値。通常はデフォルト値を使います。 327 328 @return 計算結果 329 */ 330 static u32 Calculate(const void* input, size_t length, u32 context = CRC32_POSIX_INIT); 331 332 private: 333 //! @brief 生成多項式です。 334 static const u32 CRC32_POSIX_POLY = 0x04c11db7; 335 336 //! @brief コンテキストの初期値です。 337 static const u32 CRC32_POSIX_INIT = 0; 338 339 //! @brief ハッシュ計算を行うためのコンテキスト構造体です。 340 typedef u32 Context; 341 342 //! @brief ハッシュ計算を行うためのテーブルの構造体です。 343 struct Table 344 { 345 u32 table[CRC_TABLE_SIZE]; 346 }; 347 348 //! @brief ハッシュ計算を行うためのコンテキストです。 349 Context m_Context; 350 351 //! @brief ハッシュ計算を行うためのテーブルです。 352 Table m_Table; 353 354 355 //! @brief ハッシュ計算を行うためのテーブルを初期化します。 356 //! @param[in] poly テーブルを初期化するための生成多項式 357 void InitializeTable(u32 poly); 358 359 }; 360 361 }} 362 363 #endif // __cplusplus 364 365 #endif // ifndef NN_UTIL_UTIL_CRC_H_ 366