我是很新的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的长度从串进行解码时留下了尾随字节。
对于我来说,需要来到时,我想从编码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;
}
}
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#