python-将非常大的基数n转换为字节
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-将非常大的基数n转换为字节,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1877字,纯文字阅读大概需要3分钟。
内容图文
![python-将非常大的基数n转换为字节](/upload/InfoBanner/zyjiaocheng/681/9c36217380e14e3d9940a1c7fd241f9d.jpg)
我在n进制中有一个很大的数字(n由用户指定),存储为一个数组,每个元素代表一个数字. u [0]是最高的数字,u [1]是第二高的数字,u [-1]是最低的数字,依此类推.前导零被认为是没有意义的:例如,如果n为8,则[0,0,0,4,7,3]等于[4,7,3]且都等于(473)以8为底,或者在基数10中为315,在十六进制中为13B,或作为字节数组的[1,59].
我想将其转换为字节数组,该字节数组对应于相同数字的base-256表示形式,且前导零最少.我有以下代码可以做到这一点:
def base_n_to_byte_array(digits, from_base):
""" Converts a base n number to a byte array.
:param digits: Digits of the number, starting from highest.
:param from_base: Base in which the number is given.
"""
x = 0
n = len(digits)
for i in range(0, len(digits)):
x += digits[i] * int(math.pow(from_base, n - i - 1))
min_length = max(math.ceil(math.log(x, 256)), 1)
byte_array = x.to_bytes(min_length, byteorder='big')
return byte_array
这适用于较小的数字(几百个数字).但是,事实证明math.pow相当有限,例如,如果我们使用基数8,则math.pow(8,341)是我可以获得的最高功率,而math.pow(8,342)会因OverflowError而失败:数学范围错误.
我知道处理大数的常见方法是将它们表示为浮点数-但在这种情况下,我正在使用此代码将二进制文件编码/解码为其他表示形式(例如trytes).因此,如果由于精度损失而更改了较低有效字节,那么很多数据将被破坏,因此我无法使用近似功效计算-我需要精确的结果.
我怎么解决这个问题?是否有不会溢出的math.pow版本?我有没有更高效的基本转换算法?
解决方法:
Is there a version of
math.pow
that doesn’t overflow?
尝试使用内置的幂运算符**. AFAIK与math.pow没有相同的限制.
>>> math.pow(8,342)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: math range error
>>> 8**342
719077253944926363091722076315609893447190791576922629093720324630930703222003852530833909289630144084480455519485573430635159075257666489971389722557896497511071573699461941105208878404984376477812331808340023075352602729369851525895652442163308948653402042738345192959788983753918865219341425318496896548864L
内容总结
以上是互联网集市为您收集整理的python-将非常大的基数n转换为字节全部内容,希望文章能够帮你解决python-将非常大的基数n转换为字节所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。