Question

Je veux convertir un entier à un octet [2] tableau en utilisant BCD.

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

Y at-il fonction de pré-fait qui fait cela ou pouvez-vous me donner un moyen simple de le faire?

Exemple:

int year = 2010

affichera:

byte[2]{0x20, 0x10};
Était-ce utile?

La solution

    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) };
    }

Prenez garde que vous avez demandé un résultat grand-boutiste, qui est un peu inhabituel.

Autres conseils

Voici une terrible version force brute. Je suis sûr qu'il ya une meilleure façon que cela, mais il doit travailler de toute façon.

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 };

Le plus triste est que binaire rapide à BCD conversions sont intégrées dans l'architecture microprocesseur x86, si vous pouvez obtenir à eux!

Voici une version un peu plus propre, puis Jeffrey de

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<Byte> 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 fait une routine générique affiché à IntToByteArray que vous pouvez utiliser comme:

var yearInBytes = ConvertBigIntToBcd (2010, 2);

static byte[] IntToBCD(int input) { 
    byte[] bcd = new byte[] { 
        (byte)(input>> 8), 
        (byte)(input& 0x00FF) 
    };
    return bcd;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top