TCL сохранить Bigint в двоичном - PullRequest
       29

TCL сохранить Bigint в двоичном

0 голосов
/ 23 февраля 2020

Я использую целые числа произвольной точности в TCL 8.6.

Например:

set x [expr {10**1000}]

Как я могу сохранить это число в двоичном виде? Команда binary format, похоже, не работает для этого.

Мне также нужно иметь возможность позже прочитать число.

Я знаю, что могу использовать al oop, делая x & 0XFFFF и x >> 16 для выгрузки каждого слова по одному, но я подумал, что, может быть, эффективнее был способ выгрузить память напрямую.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Это зависит от формата сериализации, который вы будете использовать sh. И код должен прочитать его снова. И как быстро это должно быть.

Один из способов, который вы могли бы использовать, - записать число в кодировке BER ASN.1, которая поддерживает двоичное целое число произвольной длины.

Это можно сделать с пакетами tcllib math :: bignum и ASN.1 :

package require asn
package require math::bignum

set x [expr {10**100}]
set bindata [asn::asnBigInteger [::math::bignum::fromstr $x]]

Как видно из названия процедуры fromstr, это не самый быстрый из возможных кодов.

Если вы хотите sh использовать некоторую другую сериализацию для целых чисел, вы можете изобрести различные методы, такие как циклическое и сдвиговое, как вы уже обнаружили.

Наивным методом Tcl было бы просто сбросить строковое представление, но это, очевидно, менее компактно.

0 голосов
/ 24 февраля 2020

Как мне сохранить это число в двоичном формате?

Как насчет использования format и scan соответственно?

scan [format %llb $x] %llb

Как вы имеете дело со строками символов, а не со строками байтов, они являются первым выбором.

...