F# - 十六进制到 ASCII

标签 f# hex

  1. 对于以下代码中的 2 个操作,是否有比 Convert 更好的方法?
  2. 我想知道这个解决方案 (sprintf) 是否比使用 Substring 的解决方案更好(或最差)
  3. 我想知道在这里使用列表是否会更好
  4. 前两个问题在字符串的大小内变化? (短的(少于 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/

相关文章:

performance - 为什么 F# 中的函数组合比管道慢得多(60%)?

javascript - 使用 NodeJS 缓冲区

f# - 实现 F# 库以供 TypeScript/Javascript 使用?

list - F# 创建用于比较包含列表的两个列表的函数

c# - System.Runtime.Numerics BigHexInteger 不工作

C# + N单元 : Unit testing methods with byte array arguments

java - 从字符串到十六进制 MD5 哈希并返回

c++ - C++ 中具有十六进制值的数组

visual-studio - 在 F# Interactive 上运行 F# 测试

entity-framework - 使用 Fluent API 定义 Entity Framework 键