我对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 回答
对JustinStolle编辑的改进(Eran Yogev使用BlockCopy) .
建议的解决方案确实比使用编码更快 . 问题是它不适用于编码长度不均匀的字节数组 . 如上所述,它引发了一个越界异常 . 将长度增加1会在从字符串解码时留下尾随字节 .
对我来说,当我想从
DataTable
编码到JSON
时需要 . 我正在寻找一种方法将二进制字段编码为字符串并从字符串解码回byte[]
.因此,我创建了两个类 - 一个包含上述解决方案的类(当从字符串编码时很好,因为长度总是偶数),另一个处理
byte[]
编码 .我通过添加一个字符来解决不均匀长度问题,该字符告诉我二进制数组的原始长度是奇数('1')还是偶数('0')
如下:
这个问题已经被多次回答了,但是使用C#7.2和Span类型的引入,有一种更快的方法可以在不安全的代码中执行此操作:
请记住,字节表示UTF-16编码的字符串(在C#land中称为“Unicode”) .
一些快速基准测试表明,对于中等大小的字符串(30-50个字符),上述方法比其Encoding.Unicode.GetBytes(...)/ GetString(...)实现大约快5倍,对于更大的字符串甚至更快 . 这些方法似乎比使用Marshal.Copy(..)或Buffer.MemoryCopy(...)的指针更快 .
有没有人看到任何理由不这样做?
首先,添加
System.Text
命名空间然后使用此代码
希望能解决它!
仅当字符为1个字节时,以下方法才有效 . (默认unicode不起作用,因为它是2个字节)
保持简单
您也可以使用Extension Method将方法添加到
string
类型,如下所示:并使用如下:
用这个
如果您已经有一个字节数组,那么您将需要知道使用什么类型的编码进入该字节数组 .
例如,如果字节数组是这样创建的:
您需要将其重新转换为如下字符串:
如果您可以在继承的代码中找到用于创建字节数组的编码,则应该设置 .