f#将十六进制字符串拆分为字符并获得每个字符的十进制值



这里主要是新手-很久以前做过shell脚本和Perl。进入函数式编程(因为不喜欢OO);开发平台是Windows VS Code,因此从f#开始(作为。net语言),最有可能导致OCaml和/或Haskell。在c#/中搜索可以找到答案。. NET库,不确定如何通过f#访问。例如,给定cf582f2d5d7d28e18335de05abc54da7,希望获得每个数字的十进制值(c为12,f为15,5为5,等等)。此外,Raku似乎是通过split然后parse-base(16)来实现这一点的。

编辑:好吧,我正试图从Raku在REPL中直接翻译:

[0] > my $str = 'cf582f2d5d7d28e18335de05abc54da7';
[1] > ( [+] ( for $str.split('', :skip-empty) -> $i { $i.parse-base(16) } ) ) / $str.chars;

返回:8.0625

其中258(十六进制数字的和)/32(十六进制字符的个数)

虽然我喜欢Raku,但我不确定它的未来是什么。我非常喜欢f#,只是试着用fsi来解决问题。我的想法是这样的:是否有一个f#相当于parse-base(16)?比如在fsi中:printfn "%i" 'a'.parse-base(16)将返回10

可以使用Convert.ToInt32函数(来自System命名空间)将十六进制格式的字符串转换为十进制整数:

open System
Convert.ToInt32("ff",16) // returns 255

要做你的例子正在做的事情,你需要遍历数字,然后对结果求和。您可以使用mapsum:

"cf582f2d5d7d28e18335de05abc54da7"
|> Seq.map (fun c -> Convert.ToInt32(string c, 16))
|> Seq.sum

或者更简洁,使用sumBy函数:

"cf582f2d5d7d28e18335de05abc54da7"
|> Seq.sumBy (fun c -> Convert.ToInt32(string c, 16))

请注意,您需要使用string c将字符转换为字符串(这是ToInt32函数所期望的)。

相关内容

  • 没有找到相关文章

最新更新