如何解决F# - 十六进制转 ASCII
- 对于以下代码中的 2 个操作,是否有比 Convert 更好的东西?
- 我想知道此解决方案 (sprintf) 是否比使用 Substring 的解决方案更好(或更差)
- 我想知道在这里使用列表是否会更好
- 前两个问题在字符串的大小内发生变化? (短的(少于 20 个字符)或长的)
假设输入总是正确的(没有奇数长度)。
let hexToAscii (hex:string) =
let chars = Array.zeroCreate<char> (hex.Length/2)
for i in 1..2..hex.Length-1 do
chars.[i/2] <- Convert.ToChar(Convert.ToByte(sprintf "%c%c" hex.[i-1] hex.[i],16))
String(chars)
这样的问题更适合https://codereview.stackexchange.com吗?
解决方法
一个更惯用的解决方案是:
首先处理单个字节,例如“42”
let hexByteToAscii (s:string) =
System.Convert.ToByte(s,16)
|> System.Convert.ToChar
让我们使用辅助函数将 char[] 转换为字符串
let charsToString (chars:char[]) =
new string (chars)
然后让我们通过获取 2 个字符的块来处理像“4142”这样的更长的序列,并使用我们现有的函数来处理字节。
let hexToAscii (value:string) =
value
|>Seq.chunkBySize 2
|>Seq.map ( hexByteToAscii << charsToString)
|>Seq.toArray
|>charsToString
你可以测试一下:
hexToAscii "4142" // "AB"
就性能而言,两者都是渐近 O(n),其中 n 是输入字符串的大小。除非您的 n> 10000,否则我不会更担心。这似乎不是您的情况。也许通过使用字典表实现自己的十六进制字节到 ascii 函数会有所收获。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。