我正在尝试将字符串的值放入字节数组中而不更改字符。这是因为字符串实际上是数据的字节表示。
目标是将输入字符串移动到字节数组中,然后使用:
转换字节数组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。
答案 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);