【发布时间】:2019-05-10 23:50:42
【问题描述】:
我正在尝试将字符串转换为 f# 中的列表,用于我的加密算法。我该如何解决这个问题?
我知道 (int char) 返回字符的 ascii 值,但我不知道如何将整个字符串映射到整数列表。据我所知,没有内置的字符串转换为列表,也没有一个映射函数可以接收字符串并将其映射到列表。
【问题讨论】:
标签: functional-programming f# data-conversion
我正在尝试将字符串转换为 f# 中的列表,用于我的加密算法。我该如何解决这个问题?
我知道 (int char) 返回字符的 ascii 值,但我不知道如何将整个字符串映射到整数列表。据我所知,没有内置的字符串转换为列表,也没有一个映射函数可以接收字符串并将其映射到列表。
【问题讨论】:
标签: functional-programming f# data-conversion
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,因为字符串本身就是一个字符序列。
字符串是字符序列,因此您只需将转换函数映射到它们:
"test" |> Seq.map int;;
val it : seq<int> = seq [116; 101; 115; 116]
如果您真的需要一个数组而不是一个序列,您可以在末尾添加另一个 |> Seq.toArray。
【讨论】:
如果您实际尝试做的是加密 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.
【讨论】: