Good way to convert between short and bytes?

后端 未结 5 1436
攒了一身酷
攒了一身酷 2021-01-02 09:30

I need to take pairs of bytes in, and output shorts, and take shorts in and output pairs of bytes. Here are the functions i\'ve devised for such a purpose:

s         


        
相关标签:
5条回答
  • 2021-01-02 10:07

    Use BitConverter

    short number = 42;
    byte[] numberBytes = BitConverter.GetBytes(number);
    short converted = BitConverter.ToInt16(numberBytes);
    
    0 讨论(0)
  • 2021-01-02 10:09

    Bytes are 8 bits, not 4, so your shifting is off. You also declared local variables in the second function so you wouldn't end up writing the the out parameters like you intend. It's also clearer/better if you limit yourself to bitwise operations (&, |, and ~) where possible.

    static short ToShort(byte byte1, byte byte2)
    {
        return (short) ((byte2 << 8) | (byte1 << 0));
    }
    
    static void FromShort(short number, out byte byte1, out byte byte2)
    {
        byte2 = (byte) (number >> 8);
        byte1 = (byte) (number >> 0);
    }
    

    Note that the left and right shifts by zero are unnecessary, strictly speaking. I just put those in for symmetry. Also, personally I'd recommend you just learn bitwise arithmetic cold and skip writing helper functions like these. No need to hide the details with something so fundamental, IMHO.

    0 讨论(0)
  • 2021-01-02 10:15

    If you want to take bytes... take bytes; and your shifts are off, and | would be more intuitive:

    static short ToShort(byte byte1, byte byte2)
    {   // using Int32 because that is what all the operations return anyway...
        return (short)((((int)byte1) << 8) | (int)byte2);
    }
    static void FromShort(short number, out byte byte1, out byte byte2)
    {
        byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
        byte2 = (byte)number;
    }
    
    0 讨论(0)
  • 2021-01-02 10:26

    Shorter version (also shifting 8 bits instead of 4):

    static short ToShort(short byte1, short byte2)
    {
        return (byte2 << 8) + byte1;
    }
    
    static void FromShort(short number, out byte byte1, out byte byte2)
    {
        byte2 = (byte)(number >> 8);
        byte1 = (byte)(number & 255);
    }
    
    0 讨论(0)
  • 2021-01-02 10:32

    System.BitConverter

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