2009-07-21 22 views
5

Estoy escribiendo una utilidad simple de encriptación/descifrado rc4 como primer proyecto. Estoy atascado en tratar de convertir la cadena dada en una matriz de bytes que luego pueden ser manipulados por el algoritmo central. ¿Cómo se convierte una cadena en una matriz de bytes en la función f #?F #: Convirtiendo una cadena en una matriz de bytes

//From another thread 
let private replace find (repl : string) (str : string) = str.Replace(find, repl) 

//let private algorithm bytes = blah blah blah 

let Encrypt (decrypted : string) = 
    decrypted.Chars 
    |> Array.map(fun c -> byte.Parse(c)) // This line is clearly not working 
    // |> algorithm 
    |> BitConverter.ToString 
    |> replace "-" "" 

FYI en C# que parece:

public static string Encrypt(string decrypted) 
    { 
     byte[] bytes = new byte[decrypted.Length]; 

     for (int i = 0; i < decrypted.Length; ++i) 
      bytes[i] = (byte)decrypted[i]; 

     Algorithm(ref bytes); 

     return BitConverter.ToString(bytes).Replace("-", "").ToLower(); 
    } 

Respuesta

8

Aunque se puede escribir su propia función para hacer el trabajo, lo mejor es seguir con los métodos de .NET incorporadas:

cadena de bytes:

System.Text.Encoding.ASCII.GetBytes("hello world!") 

bytes a cadena:

System.Text.Encoding.ASCII.GetString([|104uy; 101uy; 108uy; 108uy; 
      111uy; 32uy; 119uy; 111uy; 114uy; 108uy; 100uy; 33uy|]) 
+0

Fue el primero que necesitaba. Text.Encoding.ASCII.GetBytes (descifrado) – telesphore4

1

que podría hacer una traducción directa

let Encrypt(decrypted : string) = 
    let bytes = Array.init decrypted.Length (fun i -> byte decrypted.[i]) 
    Algorithm(ref bytes) 
    BitConverter.ToString(bytes).Replace("-", "").ToLower() 
+0

Es útil ver esta traducción, pero estoy tratando de aprender la forma funcional de hacer las cosas. No quiero escribir F # con un "acento" C#. – telesphore4

+0

Me alegra que haya encontrado esto de uso. ¿Publicaría su código final? – gradbot

2

Según la petición de Gradbot, el código final se parece a:

1) No me gustan los elencos de byte

2) La función del algoritmo principal parece muy poco funcional

La crítica constructiva es bienvenida.

Rc4.fs

#light 

open System 
open MiscUtils 
open StringUtils 

let private key = "Mykey"B 
let private byteMask = 0xff 
let private byteMax = byteMask 

let private algorithm (bytes : byte[]) = 
    let mutable j = 0 
    let mutable i = 0 
    let mutable s = [| for c in 0 .. byteMax -> (byte) c |] 

    for i in 0 .. byteMax do 
     j <- (j + (int) (s.[i] + key.[i % key.GetLength(0)])) &&& byteMask 
     Swap (&s.[i]) (&s.[j]) 

    i <- 0 
    j <- 0 
    for x in 0 .. bytes.Length - 1 do 
     i <- (i + 1) &&& byteMask 
     j <- (j + (int) s.[i]) &&& byteMask 
     Swap (&s.[i]) (&s.[j]) 
     let mutable t = (int)(s.[i] + s.[j]) &&& byteMask 
     bytes.[x] <- bytes.[x] ^^^ s.[t] 

    bytes 

let Encrypt (decrypted : string) = 
    Text.Encoding.ASCII.GetBytes decrypted 
    |> algorithm 
    |> BitConverter.ToString 
    |> ToLower 
    |> Replace "-" "" 

let Decrypt (encrypted : string) = 
    [| for i in 0 .. 2 .. encrypted.Length - 1 -> Convert.ToByte(encrypted.Substring(i, 2), 16) |] 
    |> algorithm 
    |> System.Text.Encoding.ASCII.GetString 

StringUtils.Fs

#light 

let Replace find (repl : string) (str : string) = str.Replace(find, repl) 
let ToLower (str : string) = str.ToLower() 

MiscUtils.fs

#light 

let Swap (left : 'a byref) (right : 'a byref) = 
    let temp = left 
    left <- right 
    right <- temp 
Cuestiones relacionadas