1package org.bouncycastle.crypto.util; 2 3public abstract class Pack 4{ 5 public static int bigEndianToInt(byte[] bs, int off) 6 { 7 int n = bs[ off] << 24; 8 n |= (bs[++off] & 0xff) << 16; 9 n |= (bs[++off] & 0xff) << 8; 10 n |= (bs[++off] & 0xff); 11 return n; 12 } 13 14 public static void bigEndianToInt(byte[] bs, int off, int[] ns) 15 { 16 for (int i = 0; i < ns.length; ++i) 17 { 18 ns[i] = bigEndianToInt(bs, off); 19 off += 4; 20 } 21 } 22 23 public static void intToBigEndian(int n, byte[] bs, int off) 24 { 25 bs[ off] = (byte)(n >>> 24); 26 bs[++off] = (byte)(n >>> 16); 27 bs[++off] = (byte)(n >>> 8); 28 bs[++off] = (byte)(n ); 29 } 30 31 public static void intToBigEndian(int[] ns, byte[] bs, int off) 32 { 33 for (int i = 0; i < ns.length; ++i) 34 { 35 intToBigEndian(ns[i], bs, off); 36 off += 4; 37 } 38 } 39 40 public static long bigEndianToLong(byte[] bs, int off) 41 { 42 int hi = bigEndianToInt(bs, off); 43 int lo = bigEndianToInt(bs, off + 4); 44 return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); 45 } 46 47 public static void longToBigEndian(long n, byte[] bs, int off) 48 { 49 intToBigEndian((int)(n >>> 32), bs, off); 50 intToBigEndian((int)(n & 0xffffffffL), bs, off + 4); 51 } 52 53 public static int littleEndianToInt(byte[] bs, int off) 54 { 55 int n = bs[ off] & 0xff; 56 n |= (bs[++off] & 0xff) << 8; 57 n |= (bs[++off] & 0xff) << 16; 58 n |= bs[++off] << 24; 59 return n; 60 } 61 62 public static void littleEndianToInt(byte[] bs, int off, int[] ns) 63 { 64 for (int i = 0; i < ns.length; ++i) 65 { 66 ns[i] = littleEndianToInt(bs, off); 67 off += 4; 68 } 69 } 70 71 public static void intToLittleEndian(int n, byte[] bs, int off) 72 { 73 bs[ off] = (byte)(n ); 74 bs[++off] = (byte)(n >>> 8); 75 bs[++off] = (byte)(n >>> 16); 76 bs[++off] = (byte)(n >>> 24); 77 } 78 79 public static void intToLittleEndian(int[] ns, byte[] bs, int off) 80 { 81 for (int i = 0; i < ns.length; ++i) 82 { 83 intToLittleEndian(ns[i], bs, off); 84 off += 4; 85 } 86 } 87 88 public static long littleEndianToLong(byte[] bs, int off) 89 { 90 int lo = littleEndianToInt(bs, off); 91 int hi = littleEndianToInt(bs, off + 4); 92 return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); 93 } 94 95 public static void longToLittleEndian(long n, byte[] bs, int off) 96 { 97 intToLittleEndian((int)(n & 0xffffffffL), bs, off); 98 intToLittleEndian((int)(n >>> 32), bs, off + 4); 99 } 100} 101