C# 用C语言以特定格式表示十六进制数#

C# 用C语言以特定格式表示十六进制数#,c#,C#,我有一个寄存器,它以以下格式读出版本号。这是小恩迪安。例如: 读取的寄存器值是0x15000000,但我需要在GUI中将其表示为00.00.00_15 如何在C#中以特定格式打印并同时考虑反转 您可以使用位转换器.GetBytes获取字节数组 int num = 0x15000000; var bytes = BitConverter.GetBytes(num); // If you want your code to run even on your Big Endian fridge, /

我有一个寄存器,它以以下格式读出版本号。这是小恩迪安。例如:

读取的寄存器值是
0x15000000
,但我需要在GUI中将其表示为
00.00.00_15


如何在C#中以特定格式打印并同时考虑反转

您可以使用
位转换器.GetBytes
获取字节数组

int num = 0x15000000;
var bytes = BitConverter.GetBytes(num);

// If you want your code to run even on your Big Endian fridge,
// decomment this line :)
// if (!BitConverter.IsLittleEndian) Array.Reverse(bytes);

string str = string.Format("{0:x2}.{1:x2}.{2:x2}_{3:x2}", bytes[0], bytes[1], bytes[2], bytes[3]);
然后
string.Format(“{num:x2}”
其中
x2
将给出2位的十六进制格式

请注意,一般情况下,
BitConverter.GetBytes
应仅在Intel/AMD计算机上使用!如果您希望生成可在任何地方运行的通用代码,包括您的冰箱,则最好使用下一个解决方案!(因为您的冰箱可能是Big-Endian!)

显然,您可以进行位操作、移位
>
&

string str = string.Format("{0:x2}.{1:x2}.{2:x2}_{3:x2}", num & 0xFF, (num >> 8) & 0xFF, (num >> 16) & 0xFF, (num >> 24) & 0xFF);

但是它很难读懂,除非你知道一点操作:)

不要把它当作一个数字——它不是一个数字。您可以有效地将其存储为单个
int
,这一事实与此无关——只是一个实现细节

一旦你开始考虑数组中的字节数,你就会发现“小端点”其实并不重要。相反,你只是有一个结构,以一个字节开始,意味着一件事,下一个字节意味着另一件事

有很多方法可以实现这种行为,这取决于实际值的获取位置——例如,使用
int
将无法控制endianness。如果只获取一个
字节[]
,可以执行以下操作:

string.Format("{0}.{1}.{2}_{3}", data[3], data[2], data[1], data[0])
当您处理文件(例如从文件加载数据或通过套接字发送数据)时,这通常非常容易处理。如果您处理的是本机代码互操作,则可以使用结构而不是
int
(或类似结构):

在类型中思考-不要使用原语,除非您拥有的是原语值。很明显,您使用的是一个复合值,它(无论出于何种原因)被折叠成一个基本类型。这不是保持复杂性的好主意:)

一旦有了类型,就可以确保正确的类型安全性和验证,例如,只需重写
ToString
方法,即可为用户输出值。

大多数但不是全部。因此,的正确用法是不要假设它将返回一个或另一个

int num = 0x15000000;
var bytes = BitConverter.GetBytes(num);
if (!BitConverter.IsLittleEndian) Array.Reverse(bytes); //it's big-endian, so reverse the bytes
string str = string.Format("{0:x2}.{1:x2}.{2:x2}_{3:x2}", bytes[0], bytes[1], bytes[2], bytes[3]);

从何处读取该值?“GetBytes方法返回的数组中字节的顺序取决于计算机体系结构是little endian还是big endian。”所以我想你应该看看静态的。@weston所以他不能在XBox360上使用它:-)我想这是唯一的big-endian.NETplatform@weston但你是对的。。。我会把这封信寄出去correction@xanatos手臂呢?:)它甚至是MS.NET(Windows Phone)的官方部分,而不仅仅是标准化的CLR。
int num = 0x15000000;
var bytes = BitConverter.GetBytes(num);
if (!BitConverter.IsLittleEndian) Array.Reverse(bytes); //it's big-endian, so reverse the bytes
string str = string.Format("{0:x2}.{1:x2}.{2:x2}_{3:x2}", bytes[0], bytes[1], bytes[2], bytes[3]);