2017-06-07 18 views
1

BigInteger値のための独自のクラスを作成しようとしています。このクラスでは大整数はunsigned int ints[capacity]で構成され、私はコードがBigIntegerstd::stringを変換するには、次のしている:私はunion { char[4] chars; int value; }を使用してこの問題を解決しようとするstd :: stringをint []に格納するBig Integer for C++

void FromByteString1(const std::string& buf) { 
    int mask[] = {0, 8, 16, 24}; 
    int validMask = 0xff; 
    size_t currentMask = 0, currentIndex = 0; 
    for (register size_t i = 0; i < buf.size(); ++i) { 
     int tmp = (int) buf[i]; 
     data[currentIndex] |= ((tmp << mask[currentMask]) & (validMask << mask[currentMask])); 
     if (++currentMask == 4) { 
      currentMask = 0; 
      ++currentIndex; 
     } 
    } 
} 

が、それは私に何も与えません。ここで

は私の出力である:誰もが同様の問題を抱えていたしました

#include <iostream> 
#include <iomanip> 
#include <bitset> 

#define Write(message) std::cout << message 
#define WriteLine(message) std::cout << message << std::endl 
#define WriteEndl() std::cout << std::endl 

#define WIDTH_STR 9 
#define WIDTH_INT 33 

void ShowStringChars(const std::string& str) { 
    for (size_t i = 0; i < str.length(); ++i) 
     Write(std::setw(WIDTH_STR) << str[i]); 
    WriteEndl(); 
} 

void ShowStringCodes(const std::string& str) { 
    for (size_t i = 0; i < str.length(); ++i) 
     Write(std::setw(WIDTH_STR) << (int)str[i]); 
    WriteEndl(); 
} 

void ShowStringCodesBin(const std::string& str) { 
    for (size_t i = 0; i < str.length(); ++i) { 
     std::bitset<8> bites((int)str[i]); 
     Write(std::setw(WIDTH_STR) << bites); 
    } 
    WriteEndl(); 
} 

void ShowIntValues(int* arr, size_t length) { 
    for (size_t i = 0; i < length; ++i) 
     Write(std::setw(WIDTH_INT) << arr[i]); 
    WriteEndl(); 
} 

void ShowIntValuesBin(int* arr, size_t length) { 
    for (size_t i = 0; i < length; ++i) { 
     std::bitset<32> bites(arr[i]); 
     Write(std::setw(WIDTH_INT) << bites); 
    } 
    WriteEndl(); 
} 

const int capacity = 256; 
int data[capacity]; 

void Clear() { 
    for (size_t i = 0; i < capacity; ++i) 
     data[i] = 0; 
} 

union its { 
    char chars[4]; 
    int value; 
} int_to_str; 

void FromByteString1(const std::string& buf) { 
    int mask[] = {0, 8, 16, 24}; 
    int validMask = 0xff; 
    size_t currentMask = 0, currentIndex = 0; 
    for (register size_t i = 0; i < buf.size(); ++i) { 
     int tmp = (int) buf[i]; 
     data[currentIndex] |= ((tmp << mask[currentMask]) & (validMask << mask[currentMask])); 
     if (++currentMask == 4) { 
      currentMask = 0; 
      ++currentIndex; 
     } 
    } 
} 

void FromByteString2(const std::string& buf) { 
    size_t index = 0; 
    for (size_t i = 0; i < buf.size(); i += 4, ++index) { 

     int_to_str.chars[0] = buf[i + 0]; 
     int_to_str.chars[1] = buf[i + 1]; 
     int_to_str.chars[2] = buf[i + 2]; 
     int_to_str.chars[3] = buf[i + 3]; 

     data[index] = int_to_str.value; 
    } 
} 

int main() { 

    Clear(); 

    //std::string value = "this is some string"; 
    std::string value = "this str"; 

    ShowStringChars(value); 
    ShowStringCodes(value); 
    ShowStringCodesBin(value); 

    WriteEndl(); 
    WriteEndl(); 
    WriteEndl(); 

    FromByteString1(value); 

    ShowIntValues(data, value.length()/4); 
    ShowIntValuesBin(data, value.length()/4); 

    return 0; 
} 

enter image description here

ここでは、この問題を解決するために作成されたテストプロジェクト「コンバータ」、の完全なコードがありますか?おかげで任意のヘルプ:)

+0

なぜあなたはデバッガを使用していませんか?デバッグは、プログラムの作成方法を学習するプロセスの一部です。 – PaulMcKenzie

+0

registerはC++の有効なキーワードではないことに注意してください。 –

答えて

1

用ビットセットのストリーミングオペレータがこのように振る舞うstd::bitset::to_string使用しています:

を結果の文字列は、最後の(N-1番目)ビットとに対応する第1文字でN文字が含まれています最初のビットに対応する最後の文字。

出力の最後の(右端の)文字は最下位(最初の)ビットです。

最初に読んだバイトは、少なくともシフトしています。したがって、最下位バイトになります。したがって、整数に読み込む最初のバイトは、ビットセットの出力の最も右のバイトになります。

解決策:バイトを読み取る順序を逆にします。つまり、入力バッファをビッグエンディアンではなくリトルエンディアンとして解釈します。最上位ビットの第1ビットセットを印刷するので、あなたは出力に逆に個々のバイト、または逆のセット全体でビッグエンディアンとリトルエンディアンとして解釈できること


注意。私は左から右に成長するメモリ位置に関して、ここでは逆にしています。

PS。大きな整数をnull終端文字列として表すことは、値ゼロのバイトを含む数値を表現する方法がないため、あまり有用ではありません。

関連する問題