f#byte [] - > hex - >字符串转换

zen*_*dar 6 f#

我有字节数组作为输入.我想将该数组转换为包含数组值的十六进制表示的字符串.这是F#代码:

let ByteToHex bytes = 
    bytes 
    |> Array.map (fun (x : byte) -> String.Format("{0:X2}", x))

let ConcatArray stringArray = String.Join(null, (ByteToHex  stringArray))
Run Code Online (Sandbox Code Playgroud)

这产生了我需要的结果,但我想使它更紧凑,因此我只有一个功能.我找不到在ByteToHex结尾处连接每个字节的字符串表示的函数.
我尝试了Array.concat,concat_map,我尝试了列表,但我能得到的最好的是数组或字符串列表.

问题:

  1. 这样做最简单,最优雅的方法是什么?
  2. 在F#中是否有字符串格式化构造,以便我可以从系统程序集中替换String.Format?

示例输入:[| 0x24uy; 0xA1uy; 0x00uy; 0x1Cuy |]应该产生字符串"24A1001C"

Jar*_*Par 9

你的例子没有任何内在错误.如果您想将其归结为单个表达式,请使用String.contcat方法.

let ByteToHex bytes = 
    bytes 
    |> Array.map (fun (x : byte) -> System.String.Format("{0:X2}", x))
    |> String.concat System.String.Empty
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,String.concat将只调用String.Join.您的代码可能必须稍作修改,因为根据您的示例导入系统.这可能会在F#String和System.String之间创建名称解析冲突.


jbt*_*ule 5

如果您要一步一步地进行转化和积累,那fold是您的答案。sprintf是F#字符串格式函数。

let ByteToHex (bytes:byte[]) =
    bytes |> Array.fold (fun state x-> state + sprintf "%02X" x) ""
Run Code Online (Sandbox Code Playgroud)

这也可以用StringBuilder完成

open System.Text

let ByteToHex (bytes:byte[]) =
        (StringBuilder(), bytes)
        ||> Array.fold (fun state -> sprintf "%02X" >> state.Append)  
        |> string
Run Code Online (Sandbox Code Playgroud)

产生:

[|0x24uy; 0xA1uy; 0x00uy; 0x1Cuy|] |> ByteToHex;;
val it : string = "24A1001C"
Run Code Online (Sandbox Code Playgroud)