我有字节数组作为输入.我想将该数组转换为包含数组值的十六进制表示的字符串.这是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,我尝试了列表,但我能得到的最好的是数组或字符串列表.
问题:
示例输入:[| 0x24uy; 0xA1uy; 0x00uy; 0x1Cuy |]应该产生字符串"24A1001C"
你的例子没有任何内在错误.如果您想将其归结为单个表达式,请使用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之间创建名称解析冲突.
如果您要一步一步地进行转化和积累,那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)