如何在C#中将十进制字符串值转换为十六进制字节数组?

时间:2015-01-22 14:01:57

标签: c# arrays hex bytearray

我有一个十进制格式的输入字符串:

var decString = "12345678"; // in hex this is 0xBC614E

我希望将其转换为固定长度的十六进制字节数组:

byte hexBytes[] // = { 0x00, 0x00, 0xBC, 0x61, 0x4E }

我想出了一些相当复杂的方法来做到这一点,但我怀疑有一个整洁的双线!有什么想法吗?感谢

更新:

好吧我想我可能通过让示例显示5个字节而无意中增加了一定程度的复杂性。最大值实际上是4个字节(FF FF FF FF)= 4294967295.Int64没问题。

3 个答案:

答案 0 :(得分:4)

如果您对整数的大小没有特别限制,可以使用BigInteger进行此转换:

var b = BigInteger.Parse("12345678");
var bb = b.ToByteArray();
foreach (var s in bb) {
    Console.Write("{0:x} ", s);
}

打印

4e 61 bc 0

如果字节顺序很重要,则可能需要反转字节数组。

  

最大值实际上是4个字节(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)
};

Demo.

答案 1 :(得分:3)

要将字符串转换为字节,可以使用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;
}

答案 2 :(得分:2)

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