字符串值到字节数组而不转换

时间:2011-06-06 15:01:10

标签: c# .net casting

我正在尝试将字符串的值放入字节数组中而不更改字符。这是因为字符串实际上是数据的字节表示。

目标是将输入字符串移动到字节数组中,然后使用:

转换字节数组
string result = System.Text.Encoding.UTF8.GetString(data);

我希望有人可以帮助我,虽然我知道这不是一个很好的描述。

编辑: 也许我应该解释一下,我正在研究的是一个带有文本框的简单窗体,用户可以将编码数据复制到其中,然后单击预览以查看解码数据。

编辑: 多一点代码: (inputText是一个文本框)

    private void button1_Click(object sender, EventArgs e)
    {
        string inputString = this.inputText.Text;
        byte[] input = new byte[inputString.Length];
        for (int i = 0; i < inputString.Length; i++)
        {
            input[i] = inputString[i];
        }
        string output = base64Decode(input);
        this.inputText.Text = "";
        this.inputText.Text = output;
    }

这是Windows窗体的一部分,它包含一个富文本框。这段代码不起作用,因为它不允许我将char类型转换为byte。 但是,如果我将该行更改为:

    private void button1_Click(object sender, EventArgs e)
    {
        string inputString = this.inputText.Text;
        byte[] input = new byte[inputString.Length];
        for (int i = 0; i < inputString.Length; i++)
        {
            input[i] = (byte)inputString[i];
        }
        string output = base64Decode(input);
        this.inputText.Text = "";
        this.inputText.Text = output;
    }

它编码的价值,我不想要那样。我希望这能更好地解释我想要做的事情。

编辑:base64Decode函数:

    public string base64Decode(byte[] data)
    {
        try
        {
            string result = System.Text.Encoding.UTF8.GetString(data);
            return result;
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Decode" + e.Message);
        }
    }

为了清楚起见,不使用base64对字符串进行编码。这只是我的命名错误。

请注意,这只是一行输入。

我知道了。问题是我总是试图解码错误的格式。我觉得非常愚蠢,因为当我发布示例输入时,我看到它必须是十六进制,从那时起就很容易了。我用这个网站作为参考: http://msdn.microsoft.com/en-us/library/bb311038.aspx

我的代码:

     public string[] getHexValues(string s)
     {
        int j = 0;
        string[] hex = new String[s.Length/2];
        for (int i = 0; i < s.Length-2; i += 2)
        {
            string temp = s.Substring(i, 2);
            this.inputText.Text = temp;
            if (temp.Equals("0x")) ;
            else
            {
                hex[j] = temp;
                j++;
            }
        }
        return hex;
    }

    public string convertFromHex(string[] hex)
    {
        string result = null;
        for (int i = 0; i < hex.Length; i++)
        {
            int value = Convert.ToInt32(hex[i], 16);
            result += Char.ConvertFromUtf32(value);
        }
        return result;
    }

我现在觉得很蠢,但感谢所有帮助过的人,特别是@Jon Skeet。

4 个答案:

答案 0 :(得分:5)

你是说你有这样的事情:

string s = "48656c6c6f2c20776f726c6421";

你想要这些值作为字节数组吗?然后:

public IEnumerable<byte> GetBytesFromByteString(string s) {
    for (int index = 0; index < s.Length; index += 2) {
        yield return Convert.ToByte(s.Substring(index, 2), 16);
    }
}

用法:

string s = "48656c6c6f2c20776f726c6421";
var bytes = GetBytesFromByteString(s).ToArray();

请注意

的输出
Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes));

Hello, world!

你显然需要使上述方法更加安全。

答案 1 :(得分:1)

编码有相反的方法:

byte[] data  = System.Text.Encoding.UTF8.GetBytes(originalString);

string result = System.Text.Encoding.UTF8.GetString(data);

Debug.Assert(result == originalString);

但你的意思是'没有转换'还不清楚。

答案 2 :(得分:1)

一种方法是写:

string s = new string(bytes.Select(x => (char)c).ToArray());

这将为您提供一个字符串,该字符串对于数组中的每个字节都有一个字符。

另一种方法是使用8位字符编码。例如:

var MyEncoding = Encoding.GetEncoding("windows-1252");
string s = MyEncoding.GetString(bytes);

认为 Windows-1252定义了所有256个字符,虽然我不确定。如果没有,你最终会转换为转换后的字符。您应该能够找到一个8位编码,无需任何转换即可完成此操作。但是你最好使用上面的字节到字符循环。

答案 3 :(得分:0)

你试过了吗?

string s = "....";
System.Text.UTF8Encoding.UTF8.GetBytes(s);