IntPtr 转换为 string.Format 中的十六进制字符串

Posted

技术标签:

【中文标题】IntPtr 转换为 string.Format 中的十六进制字符串【英文标题】:IntPtr into hex string in string.Format 【发布时间】:2012-10-31 04:27:34 【问题描述】:

注意,我不太确定这个问题是否属于这个网站,但我会尽量保持建设性。 为什么是代码

IntPtr ptr = new IntPtr(1234);
Console.WriteLine(string.Format("0:X8", ptr));
Console.WriteLine(ptr.ToString("X8"));
Console.WriteLine(string.Format("0:X8", ptr.ToInt32()));

输出

1234
000004D2
000004D2

为什么不直接将十六进制格式应用于IntPtr 参数,当在格式中要求时?是否有任何已知的反对设计功能的论据 - ? 如果没有反对这种设计的论据,那么我应该通过哪个渠道将此问题报告给 Microsoft?

另请注意,如果需要,调试器会以十六进制显示 IntPtr 值。 我发现打印出IntPtr 值是一种非常直观且相对频繁的方式。我还发现其他使用第一行的人编写的代码显然期望十六进制结果,但实际上结果不同。我也花了一些时间才注意到这个问题,这使得理解日志消息变得复杂。

【问题讨论】:

【参考方案1】:

对于String.Format method 使用格式字符串作为参数,参数必须实现IFormattable interface。

由于IntPtr type 没有实现IFormattableString.Format 方法只会调用无参数的ToString 方法将IntPtr 值转换为字符串。

【讨论】:

【参考方案2】:

这是因为在第一种情况下,由于 IntPtr 不是使用 String.Format 的内置整数类型之一,因此调用 ptr.ToString() 以返回字符串。由于格式仅在转换为字符串后应用,因此 X8 格式说明符无效。

【讨论】:

以上是关于IntPtr 转换为 string.Format 中的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

Twain 扫描输出将 intptr 转换为图像

如何在C#中将IntPtr转换为字节数组?

如何将 intptr_t 转换为字符串 [重复]

将 IntPtr 转换为对象 C#

SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”

如何使用 String.Format 将布尔类型转换为“ON”“OFF”