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

swi prolog中整数列表中的十六进制字符串,prolog,hex,swi-prolog,sha,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” 输出 EF42BAB1191DA272F13935F78C401E3DE0C11AFB X

想知道是否有一个库调用来转换加密库 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”

输出

EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.
当然,最上面的字符串是不明确的

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

输出

03
L = [51],
A = 51,
N = [48, 51] .
xinteger//1需要包含以下内容:-[library(http/dcg\u 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\û'.
输出可以很容易地通过以下方式捕获:

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

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

Chac,谢谢,您的第一个版本让我走上了正确的轨道,但不起作用。对于那些阅读问题的人,这里是我的最终版本

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

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

%以与LLSHA1字符串相同的样式计算sha1 % sha1string(原子、SHAString):- sha_hash(原子,页岩,[]),
使用输出到(代码(SHAString)、映射列表(asHexByte、SHAList))。

谢谢-您的第一个版本不起作用,但确实让我走上了正确的轨道。对于那些阅读这个问题的人,这里是我的versionasHexByte(X):-X>=16,格式('~R',[X])。asHexByte(X):-X<16,格式('0~R',[X])。%以与LLSHA1字符串%sha1字符串(Atom,SHAString)相同的样式计算sha1:-sha1散列(Atom,SHAList,[]),输出到(代码(SHAString),映射列表(asHexByte,SHAList))。以下是到chac库的链接
EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.
atom_to_hex(Atom, Hex) :-
    atom_codes(Atom, Codes),
    with_output_to(Hex, maplist(\I^format('~`0t~16R~2|',[I]), Codes)).