Как преобразовать строку в массив целых чисел, содержащий значения ascii соответствующих им символов? - PullRequest
4 голосов
/ 11 мая 2019

Я пытаюсь преобразовать строку в список в f # для моего алгоритма шифрования.Как бы я решил эту проблему?

Я знаю, что (int char) возвращает значение ascii символа, но я не знаю, как отобразить целую строку в список целых чисел.Насколько я знаю, нет встроенной функции преобразования строки в список или функции отображения, которая принимает строку и отображает ее в список.

Ответы [ 3 ]

4 голосов
/ 11 мая 2019
let toAsciiVals (s:string) = Array.map int (s.ToCharArray()) 

Пример в FSI:

> toAsciiVals "abcd";;
val it : int [] = [|97; 98; 99; 100|]
2 голосов
/ 11 мая 2019

Строки - это последовательности символов, поэтому вы можете просто сопоставить с ними функцию преобразования:

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

Если вам действительно нужен массив, а не последовательность, вы можете прикрепить еще один |> Seq.toArray к концу.

1 голос
/ 11 мая 2019

Если на самом деле вы пытаетесь зашифровать строку в юникоде, то вы можете использовать функции .NET для преобразования строк в байтовые массивы и из них, будь то UTF8 или UTF32. UTF8 более эффективно использует память в виде байтов, но если вы должны хранить символы в виде целых чисел один к одному, то выполнение UTF32 приведет к меньшему количеству целых чисел. Обратите внимание, что использование кодировки ASCII не сохранит символы Юникода.

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