从字符串转换为字节奇怪的行为

时间:2012-01-24 07:40:34

标签: c# encoding bytearray

我有这样的字符串“0100110011001”我想将它转换为字节数组,使得数组包含零和1个转换后数组包含49,48的问题我不知道为什么我尝试了很多编码例如我使用以下代码,并更改了编码类型

 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            byte result = encoding.GetBytes(str);

任何想法为什么会发生,以及如何实现我想要的输出

3 个答案:

答案 0 :(得分:8)

您要求使用UTF-8对字符“0”和“1”的文本进行编码。在UTF-8中,'0'由字节48表示,'1'由字节49表示。(非ASCII字符由多个字节表示。)

听起来你真的想要一个二进制解析器 - 你可以使用Convert.ToByte(text, 2)作为单个字节,但我不确定框架中有什么东西可以通过解析将任意长度的字符串转换为字节数组它是二进制的。我确信网上有很多第三方例程可以做到 - 但这并不难。

非常重要的是,您了解原始代码无法正常工作的原因 - Encoding.GetBytes

答案 1 :(得分:2)

48是0的代码,49代表1的ASCII代码。有很多方法可以执行此字符串的转换,但这应该足以让您自己管理。祝你好运:)

可能的解决方案:

    public static class StringExtensions
    {
        public static byte[] ToByteArray(this string str)
        {
            char[] arr = str.ToCharArray();
            byte[] byteArr = new byte[arr.Length];

            for (int i=0; i<arr.Length; ++i)
            {
                switch (arr[i])
                {
                    case '0': byteArr[i] = 0; break;
                    case '1': byteArr[i] = 1; break;
                    default: throw new Exception(arr[i]+" is not 0 or 1.");
                }
            }

            return byteArr;
        }
    }

答案 2 :(得分:2)

作为一行linq声明(不是我会推荐这个解决方案)。

public static byte[] ToByteArray(this string source)
{
    return
        Regex.Matches(source.PadLeft(source.Length + source.Length % 8, '0'), "[01]{0,8}")
        .Cast<Match>()
        .Where(m => m.Success && !String.IsNullOrWhiteSpace(m.Groups[0].Value))
        .Select(m => Convert.ToByte(m.Groups[0].Value, 2))
        .ToArray();
}