在C#转换字符串字节数组(Converting string to byte array in C#

2019-08-31 10:05发布

我是很新的C#。 我将东西从VB到C#。 有这个语句的语法问题:

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

然后我看到以下错误:

参数1:不能从“对象”转换为“字节[]”

关于“System.Text.Encoding.GetString(字节[])”最好重载的方法匹配具有一些无效参数

我试图根据修复代码这个职位,但仍然没有成功

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

有什么建议?

Answer 1:

如果你已经有了一个字节数组,那么你需要知道使用的是什么类型的编码,使之成为该字节数组。

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

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

你需要把它放回像这样的字符串:

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

如果你能在你继承的代码中找到,使用的编码创建字节数组,那么你应该设置。



Answer 2:

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

using System.Text;

然后,使用此代码

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

希望能解决这个问题!



Answer 3:

你也可以使用扩展方法的方法添加到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();


Answer 4:

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);
}


Answer 5:

var result = System.Text.Encoding.Unicode.GetBytes(text);


Answer 6:

用这个

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


Answer 7:

如果字符是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;
}

保持简单



Answer 8:

细化到JustinStolle的编辑(叶兰Yogev的使用BlockCopy的)。

提出的解决方案确实比使用编码更快。 问题是,它不为不均匀的长度的编码字节数组。 作为给定的,它提出了一个彻头彻尾的绑定例外。 增加1的长度从串进行解码时留下了尾随字节。

对于我来说,需要来到时,我想从编码DataTableJSON 。 我一直在寻找一种方式,以二进制领域编码成字符串,并从字符串返回解码为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;
    }
}


Answer 9:

有谁看到任何理由为什么不这样做呢?

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


Answer 10:

如果,结果 'searchResult.Properties [ “用户”] [0]',是一个字符串:

if ( ( searchResult.Properties [ "user" ].Count > 0 ) ) {

   profile.User = System.Text.Encoding.UTF8.GetString ( searchResult.Properties [ "user" ] [ 0 ].ToCharArray ().Select ( character => ( byte ) character ).ToArray () );

}

关键点在于将字符串转换为一个字节[]可以使用LINQ来完成:

.ToCharArray ().Select ( character => ( byte ) character ).ToArray () )

和逆:

.Select ( character => ( char ) character ).ToArray () )


Answer 11:

这个问题已经回答了足够多的时间,但与C#7.2和引进了跨越式的,存在不安全的代码来做到这一点更快的方法:

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#中的土地被称为“统一”)。

一些快速基准测试显示,上述方法大致5倍比他们快Encoding.Unicode.GetBytes(...)/ GetString的(...)的中型字符串(30-50个字符),甚至更快更大的字符串实现。 这些方法似乎也比使用指针与Marshal.Copy(..)或Buffer.MemoryCopy(...)更快。



Answer 12:

这对我的工作,在那之后我可以转换把我的图片在一个bytea的领域在我的数据库。

using (MemoryStream s = new MemoryStream(DirEntry.Properties["thumbnailphoto"].Value as byte[]))
{
    return s.ToArray();
}


文章来源: Converting string to byte array in C#