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

本文关键字:字节 字符串 转换 | 更新日期: 2023-09-27 18:21:09

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

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

知道为什么会发生这种情况,以及如何实现我想要的输出

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

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

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

非常重要的一点是,您要理解为什么您的原始代码不起作用——Encoding.GetBytes真正的

48是0的ASCII码,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;
        }
    }

作为一行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();
}