Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net F#:将字符串转换为字节数组_.net_String_F#_Byte - Fatal编程技术网

.net F#:将字符串转换为字节数组

.net F#:将字符串转换为字节数组,.net,string,f#,byte,.net,String,F#,Byte,作为第一个项目,我正在编写一个简单的rc4加密/解密实用程序。我一直在尝试将给定的字符串转换成一个字节数组,然后由核心算法进行操作。如何在函数f#中将字符串转换为字节数组 仅供参考,C#它看起来像: public static string Encrypt(string decrypted) { byte[] bytes = new byte[decrypted.Length]; for (int i = 0; i < decrypted.

作为第一个项目,我正在编写一个简单的rc4加密/解密实用程序。我一直在尝试将给定的字符串转换成一个字节数组,然后由核心算法进行操作。如何在函数f#中将字符串转换为字节数组

仅供参考,C#它看起来像:

    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();
    }
公共静态字符串加密(字符串解密)
{
byte[]bytes=新字节[decrypted.Length];
for(int i=0;i
尽管您可以编写自己的函数来完成这项工作,但最好还是使用内置的.NET方法:

字符串到字节:

System.Text.Encoding.ASCII.GetBytes("hello world!")
要字符串的字节数:

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

你可以直接翻译

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

根据Gradbot的请求,最终代码如下所示:

    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();
    }
1) 我不喜欢对字节进行强制转换

2) 主算法函数看起来非常不实用

我们欢迎建设性的批评

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
杂项

#light

let Swap (left : 'a byref) (right : 'a byref) =
    let temp = left
    left  <- right
    right <- temp
#灯
让我们交换(左:一个byref)(右:一个byref)=
让温度=左

左边这是我需要的第一个。Text.Encoding.ASCII.GetBytes(解密)查看此翻译非常有用,但我正在尝试学习处理问题的功能方法。我不想用C“口音”来写F。
#light

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