Created
November 11, 2015 11:43
-
-
Save dzimchuk/5f8f4cdc2801eb22df0b to your computer and use it in GitHub Desktop.
Converting Hex String To Corresponding Byte Array Using C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Origin: http://blogs.msdn.com/b/heikkiri/archive/2012/07/17/hex-string-to-corresponding-byte-array.aspx | |
void Main() | |
{ | |
var result = ConvertToByteArray("72 0B FC".Replace(" ", string.Empty)); | |
result.Dump(); | |
BitConverter.ToString(result).Dump(); | |
} | |
private static readonly byte[] Empty = new byte[0]; | |
public static byte[] ConvertToByteArray(string value) | |
{ | |
byte[] bytes = null; | |
if (String.IsNullOrEmpty(value)) | |
bytes = Empty; | |
else | |
{ | |
int string_length = value.Length; | |
int character_index = (value.StartsWith("0x", StringComparison.Ordinal)) ? 2 : 0; // Does the string define leading HEX indicator '0x'. Adjust starting index accordingly. | |
int number_of_characters = string_length - character_index; | |
bool add_leading_zero = false; | |
if (0 != (number_of_characters % 2)) | |
{ | |
add_leading_zero = true; | |
number_of_characters += 1; // Leading '0' has been striped from the string presentation. | |
} | |
bytes = new byte[number_of_characters / 2]; // Initialize our byte array to hold the converted string. | |
int write_index = 0; | |
if (add_leading_zero) | |
{ | |
bytes[write_index++] = FromCharacterToByte(value[character_index], character_index); | |
character_index += 1; | |
} | |
for (int read_index = character_index; read_index < value.Length; read_index += 2) | |
{ | |
byte upper = FromCharacterToByte(value[read_index], read_index, 4); | |
byte lower = FromCharacterToByte(value[read_index + 1], read_index + 1); | |
bytes[write_index++] = (byte)(upper | lower); | |
} | |
} | |
return bytes; | |
} | |
private static byte FromCharacterToByte(char character, int index, int shift = 0) | |
{ | |
byte value = (byte)character; | |
if (((0x40 < value) && (0x47 > value)) || ((0x60 < value) && (0x67 > value))) | |
{ | |
if (0x40 == (0x40 & value)) | |
{ | |
if (0x20 == (0x20 & value)) | |
value = (byte)(((value + 0xA) - 0x61) << shift); | |
else | |
value = (byte)(((value + 0xA) - 0x41) << shift); | |
} | |
} | |
else if ((0x29 < value) && (0x40 > value)) | |
value = (byte)((value - 0x30) << shift); | |
else | |
throw new InvalidOperationException(String.Format("Character '{0}' at index '{1}' is not valid alphanumeric character.", character, index)); | |
return value; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment