Conversion d’un entier en un tableau d’octets BCD

Je veux convertir un entier en un tableau d’octets [2] en utilisant BCD.

L’int int en question viendra de DateTime représentant l’année et doit être converti en deux octets.

Existe-t-il une fonction prédéfinie qui fait cela ou pouvez-vous me donner un moyen simple de le faire?

Exemple:

int year = 2010 

produirait:

 byte[2]{0x20, 0x10}; 

  static byte[] Year2Bcd(int year) { if (year < 0 || year > 9999) throw new ArgumentException(); int bcd = 0; for (int digit = 0; digit < 4; ++digit) { int nibble = year % 10; bcd |= nibble << (digit * 4); year /= 10; } return new byte[] { (byte)((bcd >> 8) & 0xff), (byte)(bcd & 0xff) }; } 

Attention, vous avez demandé un résultat big endian, c’est un peu inhabituel.

Voici une version terrible de la force brute. Je suis sûr qu’il existe un meilleur moyen que celui-ci, mais cela devrait quand même fonctionner.

 int digitOne = year / 1000; int digitTwo = (year - digitOne * 1000) / 100; int digitThree = (year - digitOne * 1000 - digitTwo * 100) / 10; int digitFour = year - digitOne * 1000 - digitTwo * 100 - digitThree * 10; byte[] bcdYear = new byte[] { digitOne << 4 | digitTwo, digitThree << 4 | digitFour }; 

La partie sortingste à ce sujet est que les conversions binarys rapides en BCD sont intégrées à l'architecture du microprocesseur x86, si vous pouviez vous y prendre!

Voici une version légèrement plus nette que celle de Jeffrey

 static byte[] IntToBCD(int input) { if (input > 9999 || input < 0) throw new ArgumentOutOfRangeException("input"); int thousands = input / 1000; int hundreds = (input -= thousands * 1000) / 100; int tens = (input -= hundreds * 100) / 10; int ones = (input -= tens * 10); byte[] bcd = new byte[] { (byte)(thousands << 4 | hundreds), (byte)(tens << 4 | ones) }; return bcd; } 

Solution plus commune

  private IEnumerable GetBytes(Decimal value) { Byte currentByte = 0; Boolean odd = true; while (value > 0) { if (odd) currentByte = 0; Decimal rest = value % 10; value = (value-rest)/10; currentByte |= (Byte)(odd ? (Byte)rest : (Byte)((Byte)rest << 4)); if(!odd) yield return currentByte; odd = !odd; } if(!odd) yield return currentByte; } 

J’ai créé une routine générique publiée sur IntToByteArray que vous pourriez utiliser comme:

var yearInBytes = ConvertBigIntToBcd (2010, 2);

 static byte[] IntToBCD(int input) { byte[] bcd = new byte[] { (byte)(input>> 8), (byte)(input& 0x00FF) }; return bcd; }