Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string存储到int[]中,表示C+中的大整数+;_C++_C++11_Casting - Fatal编程技术网

C++ 将std::string存储到int[]中,表示C+中的大整数+;

C++ 将std::string存储到int[]中,表示C+中的大整数+;,c++,c++11,casting,C++,C++11,Casting,我正在尝试为BigInteger值创建自己的类。在这个类中,大整数由无符号整数[capacity]组成,我有以下代码将std::string转换成biginger: void FromByteString1(const std::string& buf) { int mask[] = {0, 8, 16, 24}; int validMask = 0xff; size_t currentMask = 0, currentIndex = 0; for (re

我正在尝试为BigInteger值创建自己的类。在这个类中,大整数由
无符号整数[capacity]
组成,我有以下代码将
std::string
转换成
biginger

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;
        }
    }
}

有没有人有类似的问题?感谢您的帮助:)

位集的流式操作符使用
std::bitset::to_string
,其行为如下:

结果字符串包含N个字符,第一个字符对应于最后一位(N-1),最后一个字符对应于第一位

因此,输出的最后一个(最右边的)字符是最低有效位(第一个)

读取的第一个字节移位最少。因此,它成为最低有效字节。因此,读入整数的第一个字节将是位集输出中最右边的字节

解决方案:颠倒读取字节的顺序,即将输入缓冲区解释为小端,而不是大端


请注意,由于位集首先打印最高位,因此可以将输出解释为单个字节反转的小尾端,或整个集反转的大尾端。我在这里用倒转的方式来表示从左到右的记忆位置


PS.将大整数表示为以null结尾的字符串不是很有用,因为无法表示包含值为零的字节的数字。

为什么不使用调试器?调试是学习如何编写程序的一部分。注意,C++中的登记不是有效的关键字。
#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;
}