首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Dart BigInt泛滥?

为什么Dart BigInt泛滥?
EN

Stack Overflow用户
提问于 2021-08-29 08:59:25
回答 1查看 131关注 0票数 0

它在文档中很清楚地说

第三个整数表示,bigint,持有任意大的有符号整数。

是的,如果我知道

BigInt.parse('1401361620244348303075010764053798750806699051384896657186984262080729392169468490123546840166223286924678557627464612464171446377618435568706501027067406794991226499183297227160622976110894228304766631654633074535516079503916674556805715032127374387087475009709090')

那就有用了。

但是,当我创建一个BigInt.from(0)并反复向它添加一些内容以转换这个base64 64编码的数字时

代码语言:javascript
复制
EwnG/GyyyZR6cgLrLuY+cvvRMlNqIr0GgyqWYmrpvsWwNbVcRQ7FWJFuGWFON81W7FbX0wMyjRV7WsMmk0zisj2baRl3v3Y1LPA8ncXU9vVfqCyeXVmUgv1T9wi1k41Zjr6h7WTjZJvyQC4YpaYpZdOJcuYm8yVOlfUKJ10lm2p9yxPJLtStvwJFZy4uCF2p/sfDATIv9Vyny3Ewx/B85Ae+eg2nlRcDmZdu5ByoqOfEYaU6H1fzzHvUSUBZvHv9zBLQ6PrLG6DhYhXzxol3zpbV02NGq3WfeBLhfl4DOUiVEDi0HSLw3xyJU+rw8rS1hoQeYcyogZ8p0I3BiNRs1Q==`, 

对于BigInt,它很快就会溢出:

代码语言:javascript
复制
...
543848068542839930
1120308820846263418
3426151830059957370
-5797220206794818438
-5797220206794818438
-5797220206794818438
...

被困在-5797220206794818438。为什么是这样,以及如何将base64编码的数字转换为BigInt?我真的很困惑。

下面是将base64转换为BigInt的代码:

代码语言:javascript
复制
/// Bytes are assumed to be BigEndian.
BigInt bytesToBigInt(List<int> bytes) {
  BigInt result = BigInt.from(0);
  int e = 0;
  for (int i in bytes.reversed) {
    for (int c = 0; c < 8; c++) {
      int include = i & 1;
      i = i >> 1;
      e++;
      if (include == 1) {
        final val = pow(2, e);
        result += BigInt.from(include * val);
        print(' $result');
      }
    }
  }
  return result;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-29 10:11:42

您的具体问题是使用pow(2, e) (一旦e变大很容易溢出)而不是使用BigInt.pow(2, e)造成的。

而且,您的bytesToBigInt实现似乎比必要的复杂。正如我在注释中所指出的,如果您正在处理一个字节列表,处理每一个位都是浪费的,而且BigInt直接支持按位运算符,因此它可以简单地从一个字节序列创建一个BigInt

代码语言:javascript
复制
/// Creates a [BigInt] from a sequence of [bytes], which is assumed to be in
/// big-endian order.
BigInt bytesToBigInt(Iterable<int> bytes) {
  BigInt result = BigInt.zero;
  for (int byte in bytes) {
    result = (result << 8) | BigInt.from(byte);
  }
  return result;
}

或者:

代码语言:javascript
复制
BigInt bytesToBigInt(Iterable<int> bytes) => bytes.fold(
      BigInt.zero,
      (resultSoFar, byte) => (resultSoFar << 8) | BigInt.from(byte),
    );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68971368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档