首页 文章

在C#中将字符串转换为字节数组

提问于
浏览
405

我对C#很新 . 我正在将一些东西从VB转换为C# . 遇到此语句的语法问题:

if ((searchResult.Properties["user"].Count > 0))
{
    profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}

然后我看到以下错误:

参数1:无法从'object'转换为'byte []''System.Text.Encoding.GetString(byte [])'的最佳重载方法匹配有一些无效的参数

我试图修改基于this帖子的代码,但仍然没有成功

string User = Encoding.UTF8.GetString("user", 0);

有什么建议?

10 回答

  • 0

    对JustinStolle编辑的改进(Eran Yogev使用BlockCopy) .

    建议的解决方案确实比使用编码更快 . 问题是它不适用于编码长度不均匀的字节数组 . 如上所述,它引发了一个越界异常 . 将长度增加1会在从字符串解码时留下尾随字节 .

    对我来说,当我想从 DataTable 编码到 JSON 时需要 . 我正在寻找一种方法将二进制字段编码为字符串并从字符串解码回 byte[] .

    因此,我创建了两个类 - 一个包含上述解决方案的类(当从字符串编码时很好,因为长度总是偶数),另一个处理 byte[] 编码 .

    我通过添加一个字符来解决不均匀长度问题,该字符告诉我二进制数组的原始长度是奇数('1')还是偶数('0')

    如下:

    public static class StringEncoder
    {
        static byte[] EncodeToBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }
        static string DecodeToString(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / sizeof(char)];
            System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
            return new string(chars);
        }
    }
    
    public static class BytesEncoder
    {
        public static string EncodeToString(byte[] bytes)
        {
            bool even = (bytes.Length % 2 == 0);
            char[] chars = new char[1 + bytes.Length / sizeof(char) + (even ? 0 : 1)];
            chars[0] = (even ? '0' : '1');
            System.Buffer.BlockCopy(bytes, 0, chars, 2, bytes.Length);
    
            return new string(chars);
        }
        public static byte[] DecodeToBytes(string str)
        {
            bool even = str[0] == '0';
            byte[] bytes = new byte[(str.Length - 1) * sizeof(char) + (even ? 0 : -1)];
            char[] chars = str.ToCharArray();
            System.Buffer.BlockCopy(chars, 2, bytes, 0, bytes.Length);
    
            return bytes;
        }
    }
    
  • 31

    这个问题已经被多次回答了,但是使用C#7.2和Span类型的引入,有一种更快的方法可以在不安全的代码中执行此操作:

    public static class StringSupport
    {
        private static readonly int _charSize = sizeof(char);
    
        public static unsafe byte[] GetBytes(string str)
        {
            if (str == null) throw new ArgumentNullException(nameof(str));
            if (str.Length == 0) return new byte[0];
    
            fixed (char* p = str)
            {
                return new Span<byte>(p, str.Length * _charSize).ToArray();
            }
        }
    
        public static unsafe string GetString(byte[] bytes)
        {
            if (bytes == null) throw new ArgumentNullException(nameof(bytes));
            if (bytes.Length % _charSize != 0) throw new ArgumentException($"Invalid {nameof(bytes)} length");
            if (bytes.Length == 0) return string.Empty;
    
            fixed (byte* p = bytes)
            {
                return new string(new Span<char>(p, bytes.Length / _charSize));
            }
        }
    }
    

    请记住,字节表示UTF-16编码的字符串(在C#land中称为“Unicode”) .

    一些快速基准测试表明,对于中等大小的字符串(30-50个字符),上述方法比其Encoding.Unicode.GetBytes(...)/ GetString(...)实现大约快5倍,对于更大的字符串甚至更快 . 这些方法似乎比使用Marshal.Copy(..)或Buffer.MemoryCopy(...)的指针更快 .

  • 649

    有没有人看到任何理由不这样做?

    mystring.Select(Convert.ToByte).ToArray()
    
  • 10

    首先,添加 System.Text 命名空间

    using System.Text;
    

    然后使用此代码

    string input = "some text"; 
    byte[] array = Encoding.ASCII.GetBytes(input);
    

    希望能解决它!

  • 4

    仅当字符为1个字节时,以下方法才有效 . (默认unicode不起作用,因为它是2个字节)

    public static byte[] ToByteArray(string value)
    {            
        char[] charArr = value.ToCharArray();
        byte[] bytes = new byte[charArr.Length];
        for (int i = 0; i < charArr.Length; i++)
        {
            byte current = Convert.ToByte(charArr[i]);
            bytes[i] = current;
        }
    
        return bytes;
    }
    

    保持简单

  • 9

    您也可以使用Extension Method将方法添加到 string 类型,如下所示:

    static class Helper
    {
       public static byte[] ToByteArray(this string str)
       {
          return System.Text.Encoding.ASCII.GetBytes(str);
       }
    }
    

    并使用如下:

    string foo = "bla bla";
    byte[] result = foo.ToByteArray();
    
  • 6

    用这个

    byte[] myByte= System.Text.ASCIIEncoding.Default.GetBytes(myString);
    
  • 80

    如果您已经有一个字节数组,那么您将需要知道使用什么类型的编码进入该字节数组 .

    例如,如果字节数组是这样创建的:

    byte[] bytes = Encoding.ASCII.GetBytes(someString);
    

    您需要将其重新转换为如下字符串:

    string someString = Encoding.ASCII.GetString(bytes);
    

    如果您可以在继承的代码中找到用于创建字节数组的编码,则应该设置 .

  • 11
    static byte[] GetBytes(string str)
    {
         byte[] bytes = new byte[str.Length * sizeof(char)];
         System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
         return bytes;
    }
    
    static string GetString(byte[] bytes)
    {
         char[] chars = new char[bytes.Length / sizeof(char)];
         System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
         return new string(chars);
    }
    
  • 19
    var result = System.Text.Encoding.Unicode.GetBytes(text);
    

相关问题