我正在为我的加密算法尝试将字符串转换为f#中的列表。我该如何解决这个问题?
我知道(int char)返回字符的ascii值,但是我不知道如何将整个字符串映射到整数列表。据我所知,没有内置的强制转换列表可以将字符串列出,或者没有一个映射函数可以接收字符串并将其映射到列表。
答案 0 :(得分:4)
let toAsciiVals (s:string) = Array.map int (s.ToCharArray())
FSI中的示例:
> toAsciiVals "abcd";;
val it : int [] = [|97; 98; 99; 100|]
答案 1 :(得分:2)
字符串是字符序列,因此您可以将转换函数映射到它们上:
"test" |> Seq.map int;;
val it : seq<int> = seq [116; 101; 115; 116]
如果确实需要数组而不是序列,则可以在末尾加上另一个|> Seq.toArray
。
答案 2 :(得分:1)
如果您实际上要加密的是unicode字符串,则可以使用.NET函数将字符串与字节数组(无论是UTF8还是UTF32)之间进行转换。 UTF8以字节为单位的内存效率更高,但是如果必须将char作为int一对一存储,则通过UTF32进行操作会减少int的数量。请注意,使用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.