Revision: 15536
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 9, 2009 11:19 by pckujawa
Initial Code
/// <summary>
/// Convert the argument bytes into their binary-coded decimal (BCD) representation, e.g.
/// { 0x01, 0x10 } -> "0110" (for Big Endian byte order)
/// { 0x01, 0x10 } -> "1001" (for Little Endian byte order)
/// </summary>
/// <param name="isLittleEndian">True if the byte order is "little end first (leftmost)".</param>
/// <param name="bytes">A comma-separated list of bytes or byte array</param>
/// <returns>String representation of the bytes as BCD.</returns>
/// <exception cref="ArgumentException">Thrown if the argument bytes contain non-BCD data (e.g. nibble values with 0xA-0xF).</exception>
public static string ConvertToBinaryCodedDecimal(bool isLittleEndian, params byte[] bytes)
{
StringBuilder bcd = new StringBuilder(bytes.Length * 2);
if (isLittleEndian)
{
for (int i = bytes.Length-1; i >= 0; i--)
{
byte bcdByte = bytes[i];
int idHigh = bcdByte >> 4;
int idLow = bcdByte & 0x0F;
if (idHigh > 9 || idLow > 9)
{
throw new ArgumentException(
String.Format("One of the argument bytes was not in binary-coded decimal format: byte[{0}] = 0x{1:X2}.",
i, bcdByte));
}
bcd.Append(string.Format("{0}{1}", idHigh, idLow));
}
}
else
{
for (int i = 0; i < bytes.Length; i++)
{
byte bcdByte = bytes[i];
int idHigh = bcdByte >> 4;
int idLow = bcdByte & 0x0F;
if (idHigh > 9 || idLow > 9)
{
throw new ArgumentException(
String.Format("One of the argument bytes was not in binary-coded decimal format: byte[{0}] = 0x{1:X2}.",
i, bcdByte));
}
bcd.Append(string.Format("{0}{1}", idHigh, idLow));
}
}
return bcd.ToString();
}
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.
There is actually a built-in method to do BCD: System.BitConverter.ToString. Note, though, that BitConverter only uses the endianness of the host machine, so you might need to convert to Big or Little Endian depending on the data source or destination.
Example: `BitConverter.ToString(new byte[] {0xAE, 0xD0})` gives us the string `AE-D0`.
Initial Title
Convert bytes into a binary coded decimal (BCD) string
Initial Tags
Initial Language
C#