如何在 C# 中将十进制字符串值转换为十六进制字节数组?
How to convert decimal string value to hex byte array in C#?
我有一个十进制格式的输入字符串:
var decString = "12345678"; // in hex this is 0xBC614E
我想将其转换为固定长度的十六进制字节数组:
byte hexBytes[] // = { 0x00, 0x00, 0xBC, 0x61, 0x4E }
我想出了一些相当复杂的方法来做到这一点,但我怀疑有一个简洁的双线!有什么想法吗?谢谢
更新:
好的,我想我可能无意中增加了一个显示 5 个字节的示例的复杂性。最大值实际上是 4 个字节 (FF FF FF FF) = 4294967295。Int64 很好。
要将字符串转换为字节,您可以使用 BitConverter.GetBytes
:
var byteArray = BitConverter.GetBytes(Int32.Parse(decString)).Reverse().ToArray();
如果字符串并非总是 32 位整数,请使用适当的类型而不是 Int32
。
然后你可以检查长度并根据需要添加填充字节:
if (byteArray.Length < 5)
{
var newArray = new byte[5];
Array.Copy(byteArray, 0, newArray, 5 - byteArray.Length, byteArray.Length);
byteArray = newArray;
}
如果您对整数的大小没有特别限制,您可以使用 BigInteger
进行此转换:
var b = BigInteger.Parse("12345678");
var bb = b.ToByteArray();
foreach (var s in bb) {
Console.Write("{0:x} ", s);
}
这会打印
4e 61 bc 0
如果字节顺序很重要,您可能需要反转字节数组。
Maximum is in fact 4 bytes (FF FF FF FF) = 4294967295
您可以为此使用 uint
- 像这样:
uint data = uint.Parse("12345678");
byte[] bytes = new[] {
(byte)((data>>24) & 0xFF)
, (byte)((data>>16) & 0xFF)
, (byte)((data>>8) & 0xFF)
, (byte)((data>>0) & 0xFF)
};
您可以使用 Linq:
String source = "12345678";
// "BC614E"
String result = String.Join("", BigInteger
.Parse(source)
.ToByteArray()
.Reverse()
.SkipWhile(item => item == 0)
.Select(item => item.ToString("X2")));
如果你想要Byte[]
,那就是
// [0xBC, 0x61, 0x4E]
Byte[] result = BigInteger
.Parse(source)
.ToByteArray()
.Reverse()
.SkipWhile(item => item == 0)
.ToArray();
我有一个十进制格式的输入字符串:
var decString = "12345678"; // in hex this is 0xBC614E
我想将其转换为固定长度的十六进制字节数组:
byte hexBytes[] // = { 0x00, 0x00, 0xBC, 0x61, 0x4E }
我想出了一些相当复杂的方法来做到这一点,但我怀疑有一个简洁的双线!有什么想法吗?谢谢
更新:
好的,我想我可能无意中增加了一个显示 5 个字节的示例的复杂性。最大值实际上是 4 个字节 (FF FF FF FF) = 4294967295。Int64 很好。
要将字符串转换为字节,您可以使用 BitConverter.GetBytes
:
var byteArray = BitConverter.GetBytes(Int32.Parse(decString)).Reverse().ToArray();
如果字符串并非总是 32 位整数,请使用适当的类型而不是 Int32
。
然后你可以检查长度并根据需要添加填充字节:
if (byteArray.Length < 5)
{
var newArray = new byte[5];
Array.Copy(byteArray, 0, newArray, 5 - byteArray.Length, byteArray.Length);
byteArray = newArray;
}
如果您对整数的大小没有特别限制,您可以使用 BigInteger
进行此转换:
var b = BigInteger.Parse("12345678");
var bb = b.ToByteArray();
foreach (var s in bb) {
Console.Write("{0:x} ", s);
}
这会打印
4e 61 bc 0
如果字节顺序很重要,您可能需要反转字节数组。
Maximum is in fact 4 bytes
(FF FF FF FF) = 4294967295
您可以为此使用 uint
- 像这样:
uint data = uint.Parse("12345678");
byte[] bytes = new[] {
(byte)((data>>24) & 0xFF)
, (byte)((data>>16) & 0xFF)
, (byte)((data>>8) & 0xFF)
, (byte)((data>>0) & 0xFF)
};
您可以使用 Linq:
String source = "12345678";
// "BC614E"
String result = String.Join("", BigInteger
.Parse(source)
.ToByteArray()
.Reverse()
.SkipWhile(item => item == 0)
.Select(item => item.ToString("X2")));
如果你想要Byte[]
,那就是
// [0xBC, 0x61, 0x4E]
Byte[] result = BigInteger
.Parse(source)
.ToByteArray()
.Reverse()
.SkipWhile(item => item == 0)
.ToArray();