我收到一个错误,看起来是由于在uint字段中使用十六进制输入的错误。它出现在我正在处理的两个版本的Web服务上。
System.ArgumentException: Cannot convert 0x2 to System.UInt32.
Parameter name: type ---> System.FormatException: Input string was not in a correct format.
然而,我的同事说,当我使用C ++调用它时,它对我以前版本的Web服务起作用,但它对我正在处理的当前版本不起作用。
有没有人经历过这个?
答案 0 :(得分:1)
你在代码中使用这样的东西吗?如果没有,请尝试实现此操作(将“CF01”替换为您的输入值):
int i = Convert.ToInt32("CF01", 16);
编辑:
对于带有0x前缀的特定情况:
public int32 GetInt32FromHex(string h) {
h = h.substring(2, (h.length - 2));
return convert.ToInt32(h, 16);
}
答案 1 :(得分:0)
这是一个非常有趣的错误,因为UInt32
的Parse方法似乎只能解析documentation的[ws][sign]digits[ws]
形式的数字。该方法的一个版本可以使用NumberStyles
标记查看documentation。其中一个值是AllowHexSpecifier
,你认为它会允许0x。但是,如果您阅读Parse方法和NumberStyles无法处理0x格式的文档。如果你看它说:
如果s是十六进制数字的字符串表示形式,则不能在任何装饰(例如0x或& h)之前将其区分为十六进制数字。这会导致转换失败。
AllowHexSpecifier使其仅包含[ws]hexdigits[ws]
在解析或使用其他解析方法之前,您似乎必须摆脱前导0x。
一种方法,特别是如果存在前导0x,则执行以下操作:
var value = UInt32.Parse( "0x2".TrimStart('0').TrimStart('x'));
这里你必须要小心检查以确保你有正确的基础,你可能需要使用NumberStyles.AllowHexSpecifier
来正确解析。