c++ - 将 std::string 存储到 int[] 中用于 C++ 中的大整数

标签 c++ c++11 casting

我正在尝试为 BigInteger 值创建自己的类。在这个类中,Big Integer 由 unsigned int ints[capacity] 组成,我有以下代码将 std::string 转换为 BigInteger:

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

我尝试使用 union { char[4] chars; 来解决这个问题;整数值; },但它什么也没给我。

这是我的输出:

enter image description here

这是为解决此问题而创建的测试项目“Convertor”的完整代码:

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

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

最佳答案

bitset 的流运算符使用 std::bitset::to_string 其行为如下:

The resulting string contains N characters with the first character corresponds to the last (N-1th) bit and the last character corresponding to the first bit.

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

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

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


请注意,由于 bitset 首先打印最高位,因此您可以将输出解释为小端字节序(单个字节反转)或大端字节序(整个集合反转)。我在这里使用 reversed 来表示从左到右增长的内存位置。

附言。将大整数表示为空终止字符串不是很有用,因为无法表示包含值为零的字节的数字。

关于c++ - 将 std::string 存储到 int[] 中用于 C++ 中的大整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44409112/

相关文章:

c++ - 将参数包解压到 std::initializer_list 中?

c++11 lambda 表达式问题(vs2012 update 1)

SQL全选并更改一列的格式

c++ - 使用 C++,是否有一种安全合法的方法来为涉及多重和虚拟继承的类层次结构实现 “safe cast”,而无需 RTTI?

c++ - 如何预分配(保留)priority_queue<vector>?

c++ - C++ 中奇怪的赋值/乘法运算符行为

c++ - 氯化钠 : File open for *** failed -5

c++ - OSx (XCode) 上的 .dylib 动态转换 (dynamic_cast) 失败

c++ - 独立于消耗原子负载的变量对操作有什么影响吗?

c++ - 强制转换运算符可以是显式的吗?