Converting Little Endian to Big Endian

后端 未结 6 1386
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-27 19:32

All,

I have been practicing coding problems online. Currently I am working on a problem statement Problems where we need to convert Big Endian <-> little endian.

相关标签:
6条回答
  • 2020-11-27 19:36

    Check this out

    int little2big(int i) {
        return (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
    }
    
    0 讨论(0)
  • 2020-11-27 19:39

    the following method reverses the order of bits in a byte value:

    public static byte reverseBitOrder(byte b) {
        int converted = 0x00;
        converted ^= (b & 0b1000_0000) >> 7;
        converted ^= (b & 0b0100_0000) >> 5;
        converted ^= (b & 0b0010_0000) >> 3;
        converted ^= (b & 0b0001_0000) >> 1;
        converted ^= (b & 0b0000_1000) << 1;
        converted ^= (b & 0b0000_0100) << 3;
        converted ^= (b & 0b0000_0010) << 5;
        converted ^= (b & 0b0000_0001) << 7;
    
        return (byte) (converted & 0xFF);
    }
    
    0 讨论(0)
  • 2020-11-27 19:40

    Since a great part of writing software is about reusing existing solutions, the first thing should always be a look into the documentation for your language/library.

    reverse = Integer.reverseBytes(x);
    

    I don't know how efficient this function is, but for toggling lots of numbers, a ByteBuffer should offer decent performance.

    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
    
    ...
    
    int[] myArray = aFountOfIntegers();
    ByteBuffer buffer = ByteBuffer.allocate(myArray.length*Integer.BYTES);
    
    buffer.order(ByteOrder.LITTLE_ENDIAN);
    for (int x:myArray) buffer.putInt(x);
    
    buffer.order(ByteOrder.BIG_ENDIAN);
    buffer.rewind();
    int i=0;
    for (int x:myArray) myArray[i++] = buffer.getInt(x);
    

    As eversor pointed out in the comments, ByteBuffer.putInt() is an optional method, and may not be available on all Java implementations.

    The DIY Approach

    Stacker's answer is pretty neat, but it is possible to improve upon it.

       reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
    

    We can get rid of the parentheses by adapting the bitmasks. E. g., (a & 0xFF)<<8 is equivalent to a<<8 & 0xFF00. The rightmost parentheses were not necessary anyway.

       reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;
    

    Since the left shift shifts in zero bits, the first mask is redundant. We can get rid of the rightmost mask by using the logical shift operator, which shifts in only zero bits.

       reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;
    

    Operator precedence here, the gritty details on shift operators are in the Java Language Specification

    0 讨论(0)
  • 2020-11-27 19:47

    Java primitive wrapper classes support byte reversing since 1.5 using reverseBytes method.

    Short.reverseBytes(short i)
    Integer.reverseBytes(int i)
    Long.reverseBytes(long i)
    

    Just a contribution for those who are looking for this answer in 2018.

    0 讨论(0)
  • 2020-11-27 19:53

    The thing you need to realize is that endian swaps deal with the bytes that represent the integer. So the 4 byte number 27 looks like 0x0000001B. To convert that number, it needs to go to 0x1B000000... With your example, the hex representation of 123456789 is 0x075BCD15 which needs to go to 0x15CD5B07 or in decimal form 365779719.

    The function Stacker posted is moving those bytes around by bit shifting them; more specifically, the statement i&0xff takes the lowest byte from i, the << 24 then moves it up 24 bits, so from positions 1-8 to 25-32. So on through each part of the expression.

    For example code, take a look at this utility.

    0 讨论(0)
  • 2020-11-27 20:00

    I think this can also help:

    int littleToBig(int i)
    {
        int b0,b1,b2,b3;
    
        b0 = (i&0x000000ff)>>0;
        b1 = (i&0x0000ff00)>>8;
        b2 = (i&0x00ff0000)>>16;
        b3 = (i&0xff000000)>>24;
    
        return ((b0<<24)|(b1<<16)|(b2<<8)|(b3<<0));
    }
    
    0 讨论(0)
提交回复
热议问题