swi-prolog中整数列表中的十六进制字符串

时间:2012-02-24 18:38:07

标签: prolog hex swi-prolog sha

想知道是否有某个库调用来转换加密库 sha1返回格式

15 ?- sha_hash('howdy', X , []), atom_codes(Y, X).
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.

想要将X转换为

之类的格式

“A34F890F16”

2 个答案:

答案 0 :(得分:2)

?- sha_hash('howdy', X , []),
 atom_codes(Y, X),
 maplist(\I^format('~16R',[I]),X).

输出

EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.

但当然顶部字符串含糊不清......

或者,可以通过这种方式完成“手动”填充(这里只需1个代码)

?- phrase(xinteger(3), L, []),
   (L =[A] -> N = [48,A] ; N = L),
   format('~s',[N]).

输出

03
L = [51],
A = 51,
N = [48, 51] .

xinteger // 1要求包括:- [library(http/dcg_basics)].

编辑:我找到了填充的规范字符串:

?- format('~`0t~16R~2|', [15]).
0F
true.

然后现在可以编写原始示例

?- sha_hash('howdy', X , []),
     atom_codes(Y, X),
     maplist(\I^format('~`0t~16R~2|',[I]),X).

并输出

EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.

可以通过with_output_to

轻松捕获输出
atom_to_hex(Atom, Hex) :-
    atom_codes(Atom, Codes),
    with_output_to(Hex, maplist(\I^format('~`0t~16R~2|',[I]), Codes)).

所有这些示例都使用 library(lambda)

答案 1 :(得分:0)

Chac,谢谢,你的第一个版本让我走上正轨,但是没有用。对于那些阅读问题的人来说,这是我的最终版本

asHexByte(X): -     X> = 16,     格式('~R',[X])。

asHexByte(X): -     X< 16,     格式('0~R',[X])。

%以与llSHA1String相同的样式计算sha1 % sha1string(Atom,SHAString): -     sha_hash(Atom,SHAList,[]),     with_output_to(代码(SHAString),maplist(asHexByte,SHAList))。