3 votes

Comment convertir une chaîne de caractères en un tableau d'entiers, contenant les valeurs ascii des caractères correspondants ?

J'essaie de convertir une chaîne de caractères en une liste en f#, pour mon algorithme de cryptage. Comment puis-je résoudre ce problème ?

Je sais que (int char) renvoie la valeur ascii du caractère, mais je ne sais pas comment faire correspondre une chaîne entière à une liste d'entiers. Pour autant que je sache, il n'y a pas de fonte intégrée pour la chaîne de caractères vers une liste, ou une fonction de mappage qui prend une chaîne de caractères et la mappe vers une liste.

3voto

LSM07 Points 519
let toAsciiVals (s:string) = Array.map int (s.ToCharArray()) 

Exemple dans l'ISF :

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

2voto

Michael Kohl Points 33345

Les chaînes de caractères sont des séquences de caractères, vous pouvez donc simplement faire correspondre la fonction de conversion à ces chaînes :

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

Si vous avez vraiment besoin d'un tableau et non d'une séquence, vous pouvez ajouter une autre option |> Seq.toArray sur l'extrémité.

1voto

Bent Tranberg Points 121

Si ce que vous essayez de faire est de crypter une chaîne unicode, vous pouvez utiliser les fonctions .NET pour convertir les chaînes en tableaux d'octets, qu'ils soient UTF8 ou UTF32. L'UTF8 est plus économe en mémoire sous forme d'octets, mais si vous devez stocker les caractères sous forme d'ints un par un, le passage par l'UTF32 permettra d'obtenir moins d'ints. Notez que l'utilisation de l'encodage ASCII ne préservera pas les caractères 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X