我有一个寄存器,它按以下格式读出版本号。这是小端。例如:
读取的寄存器值为0x15000000
但我需要在GUI中将其表示为00.00.00_15
。
如何以C#中的反转方式打印特定格式?
答案 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]);