5

送信中のデータに対して CRC32 チェックを行う必要があるプロジェクトに取り組んでいます。コードを Intel アーキテクチャ (「リトル エンディアン」) だけでなく、Solaris アーキテクチャ (「ビッグ エンディアン」) にも対応させたいと考えています。この「CCRC32」は、2 つのリトル エンディアン マシンで問題なく動作しますが、クロス プラットフォーム テストには完全に失敗します。

コード:

CCRC32.h & CCRC32.cpp (ウィキペディアの「外部リンク」から削除)

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

コードのメソッド サンプルを次に示します。

void CCRC32::PartialCRC(unsigned long *ulCRC, const unsigned char *sData, unsigned long ulDataLength) {
while(ulDataLength--) {
    //If your compiler complains about the following line, try changing each
    //occurrence of *ulCRC with "((unsigned long)*ulCRC)" or "*(unsigned long *)ulCRC".

     *(unsigned long *)ulCRC =
        ((*(unsigned long *)ulCRC) >> 8)
             ^ this->ulTable[((*(unsigned long *)ulCRC) & 0xFF) ^ *sData++];
}




unsigned long CCRC32::FullCRC(const unsigned char *sData, unsigned long ulDataLength) {
    unsigned long ulCRC = 0xffffffff; //Initilaize the CRC.
    this->PartialCRC(&ulCRC, sData, ulDataLength);
    return(ulCRC ^ 0xffffffff); //Finalize the CRC and return.
}

私の質問は次のとおりです: ビッグ エンディアンの達人で、ビッグ エンディアン マシンで動作するように上記の方法を微調整する方法を知っている人はいますか? または、私の目標を達成できる既存のソース コードを知っている人はいますか? これまでのところ、検索に失敗しています。

お時間をいただきありがとうございます。

ジェームズ

4

1 に答える 1

3

役立つかどうかはわかりませんが、この C コードにはビッグ エンディアン バージョンとスモール エンディアン バージョンがあります。

于 2011-04-29T02:29:46.397 に答える