繁体   English   中英

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

[英]string values to byte array without converting

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

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

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

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

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

编辑:更多代码:(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 function:

    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。

你是说你有这样的东西:

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();

注意 output 的

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

Hello, world!

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

编码有相反的方法:

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

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

Debug.Assert(result == originalString);

但是您的意思是“不转换”尚不清楚。

一种方法是编写:

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 位编码。 但是你可能最好使用上面的字节到字符循环。

你有没有尝试过:

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

如果有人仍然需要它,这对我有用:

byte[] result = Convert.FromBase64String(str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM