Revision: 15716
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 14, 2009 14:21 by pckujawa
Initial Code
/// <summary> /// Convert the argument string into its binary-coded decimal (BCD) representation, e.g. /// "0110" -> { 0x01, 0x10 } (for Big Endian byte order) /// "0110" -> { 0x10, 0x01 } (for Little Endian byte order) /// (NOTE: It is assumed that the string is always a big-endian representation.) /// </summary> /// <param name="isLittleEndian">True if the byte order is "little end first (leftmost)".</param> /// <param name="bcdString">String representation of BCD bytes.</param> /// <returns>Byte array representation of the string as BCD.</returns> /// <exception cref="ArgumentException">Thrown if the argument string isn't entirely made up of BCD pairs.</exception> public static byte[] ConvertToBinaryCodedDecimal(bool isLittleEndian, string bcdString) { bool isValid = true; isValid = isValid && !String.IsNullOrEmpty(bcdString); // Check that the string is made up of sets of two numbers (e.g. "01" or "3456") isValid = isValid && Regex.IsMatch(bcdString, "^([0-9]{2})+$"); byte[] bytes; if (isValid) { char[] chars = bcdString.ToCharArray(); int len = chars.Length / 2; bytes = new byte[len]; if (isLittleEndian) { for (int i = 0; i < len; i++) { byte highNibble = byte.Parse(chars[2 * (len - 1) - 2 * i].ToString()); byte lowNibble = byte.Parse(chars[2 * (len - 1) - 2 * i + 1].ToString()); bytes[i] = (byte)((byte)(highNibble << 4) | lowNibble); } } else { for (int i = 0; i < len; i++) { byte highNibble = byte.Parse(chars[2 * i].ToString()); byte lowNibble = byte.Parse(chars[2 * i + 1].ToString()); bytes[i] = (byte)((byte)(highNibble << 4) | lowNibble); } } } else { throw new ArgumentException(String.Format( "Input string ({0}) was invalid.", bcdString)); } return bytes; }
Initial URL
Initial Description
BCD is where the hex value of a byte represents two integer values between zero and nine; e.g., 0x98 -> "98" (whereas its integer value is actually 152). The method throws an exception if non-BCD data is input. You can also check out the partner method, [Convert bytes into a binary coded decimal (BCD) string](http://snipplr.com/view/16802/convert-bytes-into-a-binary-coded-decimal-bcd-string/). Update: Unfortunately, there doesn't seem to be a built-in method for doing this (there is for the converse; see System.BitConverter.ToString). The System.BitConverter.GetBytes(char) overload returns the byte value of the character, rather than a BCD byte array (`BitConverter.GetBytes('A')` returns a byte array holding `[65, 0]`, not [0x0A] as we would want).
Initial Title
Convert a binary coded decimal (BCD) string into bytes
Initial Tags
Initial Language
C#