在C#中以特定格式表示十六进制数

时间:2015-03-16 12:48:37

标签: c#

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

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

如何以C#中的反转方式打印特定格式?

3 个答案:

答案 0 :(得分:5)

您可以使用BitConverter.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);

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

答案 1 :(得分:1)

不要将其视为数字 - 这不是数字。您可以将其有效地存储为单个int这一事实无关紧要 - 只是一个实现细节。

一旦开始在数组中以字节为单位进行思考,就会发现“little-endian”并不重要。相反,你只有一个以一个字节开头的结构意味着一件事,下一个是其他东西......

有很多方法可以达到这种行为,具体取决于你获得实际值的位置 - 例如,使用int不会让你控制字节序。如果您只需要byte[],就可以执行以下操作:

string.Format("{0}.{1}.{2}_{3}", data[3], data[2], data[1], data[0])

当您使用时,通常很容易处理从文件加载数据或通过套接字发送数据。如果您正在处理本机代码互操作,则可以使用结构而不是int(或类似):

struct MyVersionNumber
{
  byte Lowest;
  byte Other;
  byte YetAnother;
  byte Highest;
}

考虑类型 - 不要使用基元,除非你拥有的是原始值。你显然正在处理折叠成基本类型的复合值(无论出于何种原因)。这对维持复杂性来说不是一个好主意:)

一旦有了类型,就可以确保正确的类型安全,验证,并且只需覆盖ToString方法,例如,输出用户的值。

答案 2 :(得分:1)

大多数但不是全部.net platforms are little endian。因此BitConverter.GetBytes的正确用法是不假设它会返回一个或另一个。

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]);