C# 字符串值不转换为字节数组

C# 字符串值不转换为字节数组,c#,.net,casting,C#,.net,Casting,我试图在不改变字符的情况下将字符串的值放入字节数组。这是因为字符串实际上是数据的字节表示形式 目标是将输入字符串移动到字节数组中,然后使用以下命令转换字节数组: string result = System.Text.Encoding.UTF8.GetString(data); 我希望有人能帮助我,虽然我知道这不是一个很好的描述 编辑: 也许我应该解释一下,我正在使用的是一个简单的windows窗体,它带有一个文本框,用户可以在其中复制编码数据,然后单击“预览”查看解码数据 编辑: 再多一点代

我试图在不改变字符的情况下将字符串的值放入字节数组。这是因为字符串实际上是数据的字节表示形式

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

string result = System.Text.Encoding.UTF8.GetString(data);
我希望有人能帮助我,虽然我知道这不是一个很好的描述

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

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

为了清楚起见,字符串不是使用base64编码的。这只是代表我的不好的命名

注意,这只是一行输入

我知道了。问题是我总是试图解码错误的格式。我觉得自己很愚蠢,因为当我发布示例输入时,我看到它必须是十六进制的,从那时起就很容易了。我使用此网站作为参考:

我的代码:

     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;
    }
public string[]gethexvalue(字符串s)
{
int j=0;
字符串[]十六进制=新字符串[s.Length/2];
对于(int i=0;i
我现在觉得自己很笨,但感谢所有帮助过我的人,特别是@Jon Skeet。

你试过:

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

编码有相反的方法:

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 = "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);
    }
}
请注意

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


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

您所说的“字符串实际上是数据的字节表示”是什么意思?字符串是一个字符序列。您的原始二进制数据是如何转换为字符串的?所以您想将
字符串
转换为
字节[]
,然后再转换回来?这是家庭作业吗?顺便说一句,
BitConverter
有一个可以将
char
转换成
byte[]
。如果出于某种原因不喜欢编码,可以使用它。而且它不需要传递
编码
,因为所有的.Net字符串都是UTF字符串。@Jon Skeet。字符串存储在数据库中。在发送字符串时,它将转换为字节数组,但数据库将其保存为字符串或varchar。因此,当我获取数据时,它是一个字符串,但我需要它是一个字节数组,以便使用上面显示的转换。您可以将其视为string@Gisli:那么原始数据是什么?如果它不是文本数据,那么它绝对不应该使用类似Encoding.UTF8的东西。您的示例代码使用Base64—它实际上是Base64数据吗?如果您可以发布一些示例文本,这可能会有所帮助…感谢您的回答。这就是我的意思,但是当我尝试使用ToArray()函数时,我得到一个错误,说ToArray()没有定义。@Gisli:添加对
System.Core
的引用和使用System.Linq的
指令位于代码顶部。谢谢。现在我收到一条错误消息:找不到任何可识别的数字。如果我弄明白了,我会让你知道的。我需要在app.config文件中存储一些数据,我不想以纯文本形式存储,这是相同的概念。这对我很有帮助,谢谢-无论谁投票否决了OP,我都讨厌势利小人,他们认为这里的每个人都是专业的开发者。我们都必须从某个地方开始。很好的回答
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!