为啥转换不起作用?

Posted

技术标签:

【中文标题】为啥转换不起作用?【英文标题】:Why is conversion not working?为什么转换不起作用? 【发布时间】:2018-04-03 09:06:59 【问题描述】:

我想开发一种能够在 C++ 中进行 AnyBase 2 AnyBase 转换的算法。

所以我开始只是将this javascript code 翻译成 C++,最后使用了BigInt - library,因为它当然不能使用整数(long int、long double 等)精度 - 所以我不得不使用BigInt 库。

这是我想出的代码。到目前为止,我没有收到错误消息或警告,但转换似乎没有正确完成工作:

string enc1 = convertBaseBigInt("A", 64, 4);
cout << "enc1: " << enc1 << endl;               // gets "210000"

string dec1 = convertBaseBigInt(enc1, 4, 64);   // gets "2g0" (instead of "A")
cout << "dec1: " << dec1 << endl;

请看我的代码:

std::string convertBase(string value, int from_base, int to_base) 
string range = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
string  from_range = range.substr(0, from_base),
        to_range = range.substr(0, to_base);

int dec_value = 0;
int index = 0;
string reversed(value.rbegin(), value.rend());
for(std::string::iterator it = reversed.begin(); it != reversed.end(); ++it) 
    index++;
    char digit = *it;
    if (!range.find(digit)) return "error";
    dec_value += from_range.find(digit) * pow(from_base, index);

string new_value = "";
while (dec_value > 0) 
    new_value = to_range[dec_value % to_base] + new_value;
    dec_value = (dec_value - (dec_value % to_base)) / to_base;

return new_value;

我希望有人能够帮助我找到我的错误,因为我自己似乎无法找到它。

在此先感谢一百万,Tempi。

【问题讨论】:

为什么要调用operator 函数而不是使用运算符? 例如,BigInt::Rossi newDec = (decValue - decValue % base) / base; 比您的函数调用序列和字符串转换更具可读性。如果你不把事情弄得那么复杂,那么发现错误会容易得多。 @molbdnilo 好点,是的。尽管如此,这似乎并没有改变代码的“不工作”。太糟糕了。 所以代码 (C++) 是我从 JavaScript 代码翻译而来的,你可以在这里 find right。我通过使用 bigInt 而不是仅具有 53 位精度的 Int 改进了 javascript 代码(就像 javascript 一样)。希望我能回答你的评论:) @Teemu JS 仍然与问题完全无关......无论我写了多少 JS 行作为答案,它都无助于解决手头的 C++ 问题。 【参考方案1】:

我认为您的问题是您没有使用正确的“索引”值,它应该从 0 而不是 1 开始

删除

index++

并修改行

BigInt::Rossi add(to_string((int)(from_range.find(digit) 
 * pow(from_base, index))), BigInt::DEC_DIGIT);

BigInt::Rossi add(to_string((int)(from_range.find(digit) 
 * pow(from_base, index++))), BigInt::DEC_DIGIT);

我还建议删除 operator 关键字

例如

decValue.operator>(BigInt::Rossi("0", BigInt::DEC_DIGIT))

当这更清楚时

decValue > BigInt::Rossi("0", BigInt::DEC_DIGIT)

【讨论】:

感谢您的快速答复。你是对的 - 我的错误当然应该在之后触发 index++。但是 - 该算法似乎无论如何都不起作用。请看看我的编辑:) 编辑:即使我的问题尚未解决,您也会得到“正确答案”复选标记。也许你喜欢看我的新问题:***.com/questions/49629359/… 我认为您应该删除 BigInt 库并尝试首先使用 long int 运行它,然后在算法正常工作后重新添加 BigInt。如果我是你,我也会尝试简化代码,有很多字符串 int 转换使得代码难以阅读。你至少可以为此做一些辅助函数。 算法已经在使用 int。这是我使用 long int、long double 等的第一种方法——但是对于这些类型,只能对小字符串进行编码,否则会出现问题。所以我切换到了 bigInt 库。 @tempi 是的,您似乎是对的,也许问题出在 bigint 或 bigint 的处理上?

以上是关于为啥转换不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JavaScript RGB Hex 转换器不起作用?

短到 Int 类型转换不起作用,为啥?

为啥转换在我的情况下不起作用

为啥类型转换在 Swift 2.0 中不起作用?

我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]

为啥在这种情况下转换属性不起作用? [复制]