- 对于以下代码中的 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)
然后让我们处理更长的序列,例如“4142”,方法是采用 2 个字符的 block ,并使用我们现有的函数来处理字节。
let hexToAscii (value:string) =
value
|>Seq.chunkBySize 2
|>Seq.map ( hexByteToAscii << charsToString)
|>Seq.toArray
|>charsToString
你可以测试一下:
hexToAscii "4142" // "AB"
就性能而言,两者都是渐进的 O(n),其中 n 是输入字符串的大小。除非您的 n> 10000,否则我不会担心太多。这似乎不是您的情况。或许通过使用字典表实现您自己的十六进制字节到 ascii 函数可以获得一些 yield 。
关于F# - 十六进制到 ASCII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65477935/