如何将字符串转换为包含相应字符的ascii值的整数数组?

时间:2019-05-10 23:50:43

标签: functional-programming f# data-conversion

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

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

3 个答案:

答案 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.