Mark Chidlow
Mark Chidlow

Reputation: 1472

How to convert decimal string value to hex byte array in C#?

I have an input string which is in decimal format:

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

and I want to convert this to a fixed length hex byte array:

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

I've come up with a few rather convoluted ways to do this but I suspect there is a neat two-liner! Any thoughts? Thanks

UPDATE:

OK I think I may have inadvertently added a level of complexity by having the example showing 5 bytes. Maximum is in fact 4 bytes (FF FF FF FF) = 4294967295. Int64 is fine.

Upvotes: 2

Views: 6262

Answers (3)

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186668

You can use Linq:

  String source = "12345678";

  // "BC614E"
  String result = String.Concat(BigInteger
    .Parse(source)
    .ToByteArray()
    .Reverse()
    .SkipWhile(item => item == 0)
    .Select(item => item.ToString("X2")));

In case you want Byte[] it'll be

   // [0xBC, 0x61, 0x4E]
   Byte[] result = BigInteger
     .Parse(source)
     .ToByteArray()
     .Reverse()
     .SkipWhile(item => item == 0)
     .ToArray();

Upvotes: 4

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726499

If you have no particular limit to the size of your integer, you could use BigInteger to do this conversion:

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

This prints

4e 61 bc 0

If the order of bytes matters, you may need to reverse the array of bytes.

Maximum is in fact 4 bytes (FF FF FF FF) = 4294967295

You can use uint for that - like this:

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.

Upvotes: 5

Christoph Fink
Christoph Fink

Reputation: 23093

To convert the string to bytes you can use BitConverter.GetBytes:

var byteArray = BitConverter.GetBytes(Int32.Parse(decString)).Reverse().ToArray();

Use the appropriate type instead of Int32 if the string is not allways an 32 bit integer.
Then you could check the lenght and add padding bytes if needed:

if (byteArray.Length < 5)
{
    var newArray = new byte[5];
    Array.Copy(byteArray, 0, newArray, 5 - byteArray.Length, byteArray.Length);
    byteArray = newArray;
}

Upvotes: 3

Related Questions