gpt4 book ai didi

Android SQLiteDatabase - 存储和比较大数

转载 作者:太空狗 更新时间:2023-10-29 14:22:20 25 4
gpt4 key购买 nike

我试图存储一个非常大的数字,它大于 INTEGER 和 REAL 字段类型可以容纳的 8 个字节。我需要能够返回此字段中包含小于或大于我指定的另一个大数字的数字的行。我不知道该怎么做。似乎我唯一的选择是将它存储为文本,但是当我尝试在查询中使用 > 和 < 进行比较时遇到问题,因为文本比较与数字比较不同(当数字的位数不同)。我试过研究使用 BLOB 或将我的大数字存储为字节数组,但无济于事。用零填充数字以使它们具有相同的位数也不起作用,因为我不知道数字可能会变得多大。任何帮助表示赞赏。谢谢!

最佳答案

对于存储,您唯一的选择是 TEXT 或 BLOB,因此您必须以某种方式对数字进行编码,以便字典顺序和数字顺序相同。

对于无符号数,您可以使用类似于 SQLite4 的 varint encoding 的机制:

Let the bytes of the encoding be called A0, A1, A2, ..., A8.
If A0 is between 0 and 240 inclusive, then the result is the value of A0.
If A0 is between 241 and 248 inclusive, then the result is 240+256*(A0-241)+A1.
If A0 is 249 then the result is 2287+256*A1+A2.
If A0 is 250 then the result is A1..A3 as a 3-byte big-endian integer.
If A0 is 251 then the result is A1..A4 as a 4-byte big-endian integer.
If A0 is 252 then the result is A1..A5 as a 5-byte big-endian integer.
If A0 is 253 then the result is A1..A6 as a 6-byte big-endian integer.
If A0 is 254 then the result is A1..A7 as a 7-byte big-endian integer.
If A0 is 255 then the result is A1..A8 as a 8-byte big-endian integer.

以上是为最多 64 位数字设计的。为更大的数字扩展机制是微不足道的,只要您确实有一个上限。

如果数字可以签名,则必须将 A0 范围分成两半,并将前半部分用于负数。

如果你不需要做计算,你可以用同样的原理来存储 ASCII 数字而不是二进制值。也就是说,使用具有固定 长度的前缀来指定数字的长度,然后是数字。假设您的号码不超过 9999 位,您可以使用长度为四的前缀,例如:

0001|0  ...
0001|9
0002|10 ...
0002|99
0003|100 ...
0060|321741185926535897932384626433832795281828459045235360287471

如果你在这里需要负值,你必须为正确排序的负数/正数选择一个额外的前缀(-/+的ASCII顺序是错误的,所以你最好使用像 n/p 这样的东西,并且您必须为负数使用像 9999 – length 这样的前缀,以便较小的负数具有较小的前缀。

关于Android SQLiteDatabase - 存储和比较大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15536267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com