首页 > C# > 从 VB 转换为 C#,无法从“对象”转换为“字节[]”

从 VB 转换为 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(byte[])’的最佳
重载方法匹配有一些无效的参数

我试图根据这篇文章修复代码,但仍然没有成功

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

有什么建议吗?

分割线

网友回答:

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

using System.Text;

然后使用此代码

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

希望能解决它!

分割线

网友回答:

如果您已经有一个字节数组,那么您需要知道使用哪种类型的编码将其放入该字节数组中。

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

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

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

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

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

分割线

网友回答:

编码。不应使用默认值…

一些答案使用,但是微软对此提出了警告:Encoding.Default

不同的计算机可以使用不同的编码作为默认值,并且默认编码可以在一台计算机上更改。如果使用默认编码对计算机之间流式传输的数据或在同一台计算机上不同时间检索的数据进行编码和解码,则可能会错误地转换该数据。此外,Default 属性返回的编码使用最佳拟合回退 [即编码完全搞砸了,因此无法重新编码] 将不支持的字符映射到代码页支持的字符。出于这些原因,不建议使用默认编码。若要确保正确解码编码的字节,应使用 Unicode 编码,例如 UTF8 编码或 Unicode 编码。您还可以使用更高级别的协议来确保编码和解码使用相同的格式。

要检查默认编码是什么,请使用(在我的例子中为 1250 – 遗憾的是,没有预定义的 CP1250 编码类,但对象可以检索为 )。Encoding.Default.WindowsCodePageEncoding.GetEncoding(1250)

…应改用 UTF-8/UTF-16LE 编码…

Encoding.ASCII在得分最高的答案是 7bit,所以在我的情况下它也不起作用:

byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e

遵循微软的建议:

var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže

Encoding.UTF8其他人推荐的是 UTF-8 编码的实例,也可以直接使用或作为

var utf8 = Encoding.UTF8 as UTF8Encoding;

Encoding.Unicode在内存中很流行字符串表示形式,因为它使用固定的每个字符 2 个字节,因此可以在恒定时间内跳转到第 n 个字符,但代价是使用更多的内存:它是 UTF-16LE。在 MSVC# 中,默认情况下,*.cs 文件采用 UTF-8 BOM 格式,其中的字符串常量在编译时转换为 UTF-16LE(请参阅@OwnagelsMagic注释),但它未定义为默认值:许多类(如 StreamWriter)默认使用 UTF-8。

…但它并不总是使用

默认编码具有误导性:.NET 在任何地方都使用 UTF-8(包括在源代码中硬编码的字符串)和 UTF-16LE () 将字符串存储在内存中,但 Windows 实际上使用其他 2 个非 UTF8 默认值:ANSI 代码页(用于 .NET 之前的 GUI 应用)和 OEM 代码页(又名 DOS 标准)。这些因国家/地区而异(例如,Windows捷克版使用CP1250和CP852),并且通常在Windows API库中进行硬编码。因此,如果您只是将 UTF-8 设置为控制台(就像 .NET 隐式做的那样并假装它是默认值)并运行一些本地化命令(如 ping),它在英文版本中有效,但您会得到捷克共和国的豆腐文本。Encoding.Unicodechcp 65001

让我分享一下我的真实世界经验:我创建了WinForms应用程序,为教师自定义git脚本。输出是通过微软描述的过程在后台任意获得的(我添加的粗体文本):

在此上下文中,“shell”一词(UseShellExecute)是指图形shell(类似于Windows shell,ANSI CP)而不是命令shell(例如,bash或sh,OEM CP),并允许用户在非美国环境中启动图形应用程序或打开输出混乱的文档。

因此,实际上 GUI 默认为 UTF-8,进程默认为 CP1250,控制台默认为 852。因此,输出在 852 中解释为 UTF-8 解释为 CP1250。我得到了豆腐文本,由于双重转换,我无法从中推断出原始代码页。我花了一周的时间才弄清楚为进程脚本显式设置 UTF-8 并在主线程中将输出从 CP1250 转换为 UTF-8。现在它在东欧工作,但西欧 Windows 使用 1252。ANSI CP不容易确定,因为许多命令(例如)也是本地化的,并且其他方法因版本而异:在这种环境中可靠地显示国家字符几乎是不可行的。systeminfo

因此,直到 21 世纪下半叶,请不要使用任何“默认代码页”显式设置(如果可能的话,为 UTF-8 或 UTF-16LE)。

模板简介:该模板名称为【从 VB 转换为 C#,无法从“对象”转换为“字节[]”】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 281次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-02
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 单页式简历模板 微信公众平台 响应式 html5 自适应 微信图片 企业网站 微信文章 微信素材
您可能会喜欢的其他模板