关于c#:字符串值到字节数组而不进行转换

string values to byte array without converting

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

目标是将输入字符串移动到字节数组中,然后使用以下方法转换字节数组:

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

我希望有人能帮助我,尽管我知道这不是一个很好的描述。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
    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。但是如果我把行改为:

1
2
3
4
5
6
7
8
9
10
11
12
    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;
    }

它对值进行编码,我不想这样。我希望这能更好地解释我想做的事情。

编辑:base64解码功能:

1
2
3
4
5
6
7
8
9
10
11
12
    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

我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
     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;
    }

我现在觉得自己很笨,但感谢所有帮助过我的人,尤其是在乔恩·斯基特。


你说你有点像这样:

1
string s ="48656c6c6f2c20776f726c6421";

论文的价值和你想作为一个字节数组?然后:

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

用法:

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

注意的是,输出

1
Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes));

1
Hello, world!

你显然需要补焊安全上面的方法。


单向的待办事项会写:

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

这将给你一个字符串的字符的每一个有单字节数组。

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

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

我认为所有的256个字符定义windows 1252,虽然我不确定。如果它不好,你会最终与转换特征。你应该能够找到在8位编码,这将不做任何转换。但也许你是更好的开关使用的字节到字符环以上。


安切洛蒂:逆向法编码

1
2
3
4
5
byte[] data  = System.Text.Encoding.UTF8.GetBytes(originalString);

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

Debug.Assert(result == originalString);

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


你有没有试过:

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