【问题标题】:How to convert a string into an array of integers, containing the ascii values of their corresponding characters?如何将字符串转换为整数数组,其中包含对应字符的 ascii 值?
【发布时间】:2019-05-10 23:50:42
【问题描述】:

我正在尝试将字符串转换为 f# 中的列表,用于我的加密算法。我该如何解决这个问题?

我知道 (int char) 返回字符的 ascii 值,但我不知道如何将整个字符串映射到整数列表。据我所知,没有内置的字符串转换为列表,也没有一个映射函数可以接收字符串并将其映射到列表。

【问题讨论】:

    标签: functional-programming f# data-conversion


    【解决方案1】:
    let toAsciiVals (s:string) = Array.map int (s.ToCharArray()) 
    

    FSI 中的示例:

    > toAsciiVals "abcd";;
    val it : int [] = [|97; 98; 99; 100|]
    

    【讨论】:

    • 你不需要s.ToCharArray():Seq.map int s,因为字符串本身就是一个字符序列。
    【解决方案2】:

    字符串是字符序列,因此您只需将转换函数映射到它们:

    "test" |> Seq.map int;;
    val it : seq<int> = seq [116; 101; 115; 116]
    

    如果您真的需要一个数组而不是一个序列,您可以在末尾添加另一个 |&gt; Seq.toArray

    【讨论】:

      【解决方案3】:

      如果您实际尝试做的是加密 unicode 字符串,那么您可以使用 .NET 函数将字符串与字节数组(无论是 UTF8 还是 UTF32)进行转换。 UTF8 作为字节的内存效率更高,但是如果您必须将字符存储为一对一的整数,那么通过 UTF32 将导致更少的整数。请注意,使用 ASCII 编码不会保留 unicode 字符。

      open System.Text
      
      let s = "abc æøå ÆØÅ"
      
      let asciiBytes = Encoding.ASCII.GetBytes s
      let asciiString = Encoding.ASCII.GetString asciiBytes
      printfn "%s" asciiString // outputs "abc ??? ???"
      
      let utf8Bytes = Encoding.UTF8.GetBytes s
      let utf8String = Encoding.UTF8.GetString utf8Bytes
      printfn "%s" utf8String // outputs "abc æøå ÆØÅ"
      
      let utf32Bytes = Encoding.UTF32.GetBytes s
      let utf32String = Encoding.UTF32.GetString utf32Bytes
      printfn "%s" utf32String // outputs "abc æøå ÆØÅ"
      
      let bytesToInts (bytes: byte[]) = bytes |> Array.map (fun b -> int b)
      
      let intsAsBytesToInts (bytes: byte[]) =
          bytes |> Array.chunkBySize 4 |> Array.map (fun b4 -> BitConverter.ToInt32(b4,0))
      
      let utf8Ints = bytesToInts utf8Bytes
      printfn "%A" utf8Ints
      // [|97; 98; 99; 32; 195; 166; 195; 184; 195; 165; 32; 195; 134; 195; 152; 195; 133|]
      // Note: This reflects what the encoded UTF8 byte array looks like.
      
      let utf32Ints = intsAsBytesToInts utf32Bytes
      printfn "%A" utf32Ints
      // [|97; 98; 99; 32; 230; 248; 229; 32; 198; 216; 197|]
      // Note: This directly reflects the chars in the unicode string.
      

      【讨论】:

      • 我不确定 UTF32 是否是 unicode 字符到 32 位值的一对一映射。几年前我研究过这个,并怀疑在某些文化中存在一些使用某种逃避机制的奇异字符。如果这是正确的,那么就更有理由使用编码而不是制作自己的映射。
      • 我忽略了还有使用UTF-16的Encoding.Unicode。这是否使用转义码,如果是,我不知道是什么字符和语言。
      猜你喜欢
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多