【问题标题】:cannot convert from byte to string (VB.Net to C#)无法从字节转换为字符串(VB.Net 到 C#)
【发布时间】:2014-06-18 10:32:26
【问题描述】:

我有一个用 VB.net 编写的代码,并将其翻译成 C#(通过某个站点)。代码并不复杂,所以大部分翻译结果都很好,没有任何问题。 但是,一个问题确实让我很头疼,虽然许多网站(包括这个)都引用了它,但我仍然无法让它运行。 我在 VB.Net 中有一个函数标记为:

Public Shared Function UTF8HexToByte(ByVal str As String) As Byte

译者将其改为:

public static byte UTF8HexToByte(string str)

稍后,在我的 C# 代码中,我将调用此函数:

   for (int i = 0; i <= Key1.Length - 1; i++)
            {
                Key1[i] = 16 * UTF8HexToByte(TempKey1[2 * i]) + UTF8HexToByte(TempKey1[2 * i + 1]);

            }

但是在 VB.net 中起作用的东西在这里不起作用。我收到此错误:

错误 7 'maker.Resources.makeC.UTF8HexToByte(string)' 的最佳重载方法匹配有一些无效参数

错误 8 参数 1:无法从 'byte' 转换为 'string'

现在,我想问题是UTF8HexToByte 正在接收一个字符串并返回一个字节,而我给它一个字节TempKey1 而不是一个字符串。 但它确实适用于 VB.Net 代码,所以我很困惑......这是 VB.Net 的代码:

For i As Integer = 0 To Key1.Length - 1
        Key1(i) = 16 * UTF8HexToByte(TempKey1(2 * i)) + UTF8HexToByte(TempKey1(2 * i + 1))
    Next

TempKey 是一个字节[],Key1 是一个字节[]。

任何帮助都可以。我真的坚持这个。

【问题讨论】:

  • char(TempKey1) 有用吗?否则,您确定错误存在吗?如果Key1 是一个字节,如您所说,我预计Key1.Length 会出现错误。还是您的意思是“是一个字节数组”?
  • 尝试将字节显式转换为字符串;即 UTF8HexToByte(TempKey1[2 * i].ToString())
  • 我猜这是在 VB.NET 中发生的隐式转换问题。 C# 的类型更安全,可以防止您在编译时使用错误输入的参数来调用此类接口。您可能需要最终明确地强制执行此(字符串)参数。无论如何,UTF8HexToByte 有一个非常误导性的签名,可能整个策略都应该重构。
  • @MrLister 字节数组。抱歉,我会修改 q。

标签: c# vb.net


【解决方案1】:

我对 VB.NET 不是很好,但是快速测试代码表明我很高兴将 byte 传递给需要 string 的函数。这根本不是 C# 会喜欢的东西,所以你别无选择,只能编写一些代码来进行转换。

要获得它并保持原始代码的语义,您需要弄清楚 VB.NET 做了什么来将 byte 转换为 string 并复制它。

这只是对byteToString()方法的调用并非不可能,所以

Key1[i] = 16 * UTF8HexToByte(TempKey1[2 * i].ToString()) + UTF8HexToByte(TempKey1[2 * i + 1].ToString());

您会在 C# 中发现的一件事是,它对类型和类型转换更加严格,迫使您考虑数据如何从一种格式更改为另一种格式。

【讨论】:

    【解决方案2】:

    在 C# 中 bytestring 之间没有隐式或自动转换。最好的办法是通过string.Format 获得string

    string.Format("{0}", yourByte)
    

    正如@Mr Lister 所说,string.Format 将返回一个带有字节数值的字符串。如果您需要将其解释为 ASCII 字符,则只需将其转换为 char

    (char)yourByte
    

    【讨论】:

    • 这将产生像“122”这样的字符串,而不是所需的“z”。
    • 抱歉,我没明白需要这个角色。在这种情况下,转换为 char 就足够了:(char)yourByte.
    【解决方案3】:

    方法签名告诉你它需要字符串。 'maker.Resources.makeC.UTF8HexToByte(string)' has some invalid arguments
    改变

    Key1[i] = 16 * UTF8HexToByte(TempKey1[2 * i]) + UTF8HexToByte(TempKey1[2 * i + 1]);
    

    Key1[i] = 16 * UTF8HexToByte(System.Text.Encoding.UTF8.GetString(new []{TempKey1[2 * i]})) + UTF8HexToByte(System.Text.Encoding.UTF8.GetString(new []{TempKey1[2 * i + 1]}));
    

    【讨论】:

    • 我做到了,现在收到此消息:错误 7 无法将类型“int”隐式转换为“byte”。存在显式转换(您是否缺少演员表?)。我想这是因为 i 是一个整数?我说的对吗?
    • 更新了答案,是的,您可能需要投射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多