Converting a int to a BCD byte array

后端 未结 6 1660
感动是毒
感动是毒 2020-12-21 01:24

I want to convert an int to a byte[2] array using BCD.

The int in question will come from DateTime representing the Year and must be converted to two bytes.

相关标签:
6条回答
  • 2020-12-21 01:34

    More common solution

        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;
        }
    
    0 讨论(0)
  • 2020-12-21 01:47

    Here is a slightly cleaner version then Jeffrey's

    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;
    }
    
    0 讨论(0)
  • 2020-12-21 01:49

    I made a generic routine posted at IntToByteArray that you could use like:

    var yearInBytes = ConvertBigIntToBcd(2010, 2);

    0 讨论(0)
  • 2020-12-21 01:55

    Here's a terrible brute-force version. I'm sure there's a better way than this, but it ought to work anyway.

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

    The sad part about it is that fast binary to BCD conversions are built into the x86 microprocessor architecture, if you could get at them!

    0 讨论(0)
  • 2020-12-21 01:56
    static byte[] IntToBCD(int input) { 
        byte[] bcd = new byte[] { 
            (byte)(input>> 8), 
            (byte)(input& 0x00FF) 
        };
        return bcd;
    }
    
    0 讨论(0)
  • 2020-12-21 02:00
        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) };
        }
    

    Beware that you asked for a big-endian result, that's a bit unusual.

    0 讨论(0)
提交回复
热议问题