ffenix
ffenix

Reputation: 553

short to byte conversion

I am trying to convert a short type into 2 bytes type for store in a byte array, here is the snippet thats been working well "so far".

if (type == "short")
{
   size = data.size;
   databuffer[index+1] = (byte)(data.numeric_data >> 8);
   databuffer[index] = (byte)(data.numeric_data & 255);
   return size;
}

Numeric_data is int type. It all worked well till i process the value 284 (decimal). It turns out that 284 >> 8 is 1 instead of 4.

The main goal is to have:

byte[0] = 28
byte[1] = 4

Upvotes: 3

Views: 3063

Answers (5)

Roger Johansson
Roger Johansson

Reputation: 23214

Drop the nonsense conversion you are using and go for System.BitConverter.ToInt16

  //to bytes
  var buffer = System.BitConverter.GetBytes(284); //your short value

  //from bytes
  var value = System.BitConverter.ToInt16(buffer, 0);

Upvotes: 1

horgh
horgh

Reputation: 18553

Just for fun:

public static byte[] ToByteArray(short s)
{
    //return, if `short` can be cast to `byte` without overflow
    if (s <= byte.MaxValue) 
        return new byte[] { (byte)s };

    List<byte> bytes = new List<byte>();
    byte b = 0;
    //determine delta through the number of digits
    short delta = (short)Math.Pow(10, s.ToString().Length - 3);
    //as soon as byte can be not more than 3 digits length
    for (int i = 0; i < 3; i++) 
    {
        //take first 3 (or 2, or 1) digits from the high-order digit
        short temp = (short)(s / delta);
        if (temp > byte.MaxValue) //if it's still too big
            delta *= 10;
        else //the byte is found, break the loop
        {
            b = (byte)temp;
            break;
        }
    }
    //add the found byte
    bytes.Add(b);
    //recursively search in the rest of the number
    bytes.AddRange(ToByteArray((short)(s % delta))); 
    return bytes.ToArray();
}

this recursive method does what the OP need with at least any positive short value.

Upvotes: 2

John Alexiou
John Alexiou

Reputation: 29264

Is this what you are looking for:

    static void Main(string[] args)
    {
        short data=284;

        byte[] bytes=BitConverter.GetBytes(data);
        // bytes[0] = 28
        // bytes[1] = 1
    }

Upvotes: 4

leppie
leppie

Reputation: 117300

If you insist:

short val = 284;
byte a = (byte)(val / 10);
byte b = (byte)(val % 10);

Disclaimer:

This does not make much sense, but it is what you want. I assume you want values from 0 to 99. The logical thing to do would be to use 100 as the denominator and not 10. But then again, I have no idea what you want to do.

Upvotes: 1

ybo
ybo

Reputation: 17162

Why would 284 >> 8 would be 4?

Why would 284 be split in two bytes equal to 28 and 4?

The binary representation of 284 is 0000 0001 0001 1100. As you can see, there are two bytes (eight bits) which are 0000 0001 (256 in decimal) and 0001 1100 (28 in decimal).

284 >> 8 is 1 (0000 0001) and it is correct.

284 should be split in two bytes equal to 256 and 24.

You conversion is correct!

Upvotes: 1

Related Questions