在python中,可以处理非常大的整数(例如,uuid.uuid4().int.bit_length()提供128个整数),但是C-API文档提供的最大的int数据结构是long long,它是一个int。
我希望能够从一个int128中获得一个C PyLong,但似乎没有这样的工具。例如,AsLongLong不能处理大于2**64的python整数。
long long和int128的工具,例如PyLong_AsInt128AndOverflow函数)。发布于 2019-01-20 18:17:31
有几种不同的方法可以访问您想要的精度级别。
具有64位long的系统通常有128位的long long。注意,您链接的文章中写着“至少64位”。如果没有更多的工作可做,那么检查sizeof(long long)是值得的。
假设这不是您正在使用的,那么您必须仔细查看原始PyLongObject,它实际上是私有_longobject结构的一个typedef。
原始位可以通过ob_digit字段访问,长度由ob_size指定。数字的数据类型以及它们持有的实际引导数由typedef digit和宏PYLONG_BITS_IN_DIGIT提供。后者必须小于8 * sizeof(digit),大于8,倍数为5(所以是30还是15,这取决于构建的方式)。
幸运的是,在copy中有一个“无文档”的方法,它将为您复制数字的字节:_PyLong_AsByteArray。longobject.h中的评论如下:
/* _PyLong_AsByteArray:将长v最小的8*n位转换为基-256整数,存储在数组字节中。通常返回0,在错误时返回-1。如果little_endian为1/true,则将MSB存储在bytesn-1处,LSB存储在字节处;否则(little_endian为0/false)将MSB存储在字节处,LSB存储在bytesn-1处。如果is_signed为0/false,如果v<0,则为错误;否则(v >= 0) n字节被填充,而MSB的位0x80没有什么特殊之处。如果is_signed为1/true,则字节填充v值的2‘s-补表示。MSB的位0x80是符号位。错误返回(-1):+ is_signed为0,v<0。本例中设置了TypeError,字节不被更改。+n不足以容纳v的全部数学值--例如,如果is_signed为0,且v中的数字比n中的数字多;或者如果is_signed为1,v<0,则n只差1点就足够大,足以容纳一个符号。在这种情况下,OverflowError是设置的,但是字节保存了真值的最小的n字节。*/
你应该可以得到一个UUID
PyLongObject *mylong;
unsigned char myuuid[16];
_PyLong_AsByteArray(mylong, myuuid, sizeof(myuuid), 1, 0);https://stackoverflow.com/questions/54277671
复制相似问题