1 package org.bouncycastle.util; 2 3 /** 4 * Utility methods for converting byte arrays into ints and longs, and back again. 5 */ 6 public abstract class Pack 7 { 8 public static short bigEndianToShort(byte[] bs, int off) 9 { 10 int n = (bs[ off] & 0xff) << 8; 11 n |= (bs[++off] & 0xff); 12 return (short)n; 13 } 14 15 public static int bigEndianToInt(byte[] bs, int off) 16 { 17 int n = bs[ off] << 24; 18 n |= (bs[++off] & 0xff) << 16; 19 n |= (bs[++off] & 0xff) << 8; 20 n |= (bs[++off] & 0xff); 21 return n; 22 } 23 24 public static void bigEndianToInt(byte[] bs, int off, int[] ns) 25 { 26 for (int i = 0; i < ns.length; ++i) 27 { 28 ns[i] = bigEndianToInt(bs, off); 29 off += 4; 30 } 31 } 32 33 public static byte[] intToBigEndian(int n) 34 { 35 byte[] bs = new byte[4]; 36 intToBigEndian(n, bs, 0); 37 return bs; 38 } 39 40 public static void intToBigEndian(int n, byte[] bs, int off) 41 { 42 bs[ off] = (byte)(n >>> 24); 43 bs[++off] = (byte)(n >>> 16); 44 bs[++off] = (byte)(n >>> 8); 45 bs[++off] = (byte)(n ); 46 } 47 48 public static byte[] intToBigEndian(int[] ns) 49 { 50 byte[] bs = new byte[4 * ns.length]; 51 intToBigEndian(ns, bs, 0); 52 return bs; 53 } 54 55 public static void intToBigEndian(int[] ns, byte[] bs, int off) 56 { 57 for (int i = 0; i < ns.length; ++i) 58 { 59 intToBigEndian(ns[i], bs, off); 60 off += 4; 61 } 62 } 63 64 public static long bigEndianToLong(byte[] bs, int off) 65 { 66 int hi = bigEndianToInt(bs, off); 67 int lo = bigEndianToInt(bs, off + 4); 68 return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); 69 } 70 71 public static void bigEndianToLong(byte[] bs, int off, long[] ns) 72 { 73 for (int i = 0; i < ns.length; ++i) 74 { 75 ns[i] = bigEndianToLong(bs, off); 76 off += 8; 77 } 78 } 79 80 public static byte[] longToBigEndian(long n) 81 { 82 byte[] bs = new byte[8]; 83 longToBigEndian(n, bs, 0); 84 return bs; 85 } 86 87 public static void longToBigEndian(long n, byte[] bs, int off) 88 { 89 intToBigEndian((int)(n >>> 32), bs, off); 90 intToBigEndian((int)(n & 0xffffffffL), bs, off + 4); 91 } 92 93 public static byte[] longToBigEndian(long[] ns) 94 { 95 byte[] bs = new byte[8 * ns.length]; 96 longToBigEndian(ns, bs, 0); 97 return bs; 98 } 99 100 public static void longToBigEndian(long[] ns, byte[] bs, int off) 101 { 102 for (int i = 0; i < ns.length; ++i) 103 { 104 longToBigEndian(ns[i], bs, off); 105 off += 8; 106 } 107 } 108 109 public static short littleEndianToShort(byte[] bs, int off) 110 { 111 int n = bs[ off] & 0xff; 112 n |= (bs[++off] & 0xff) << 8; 113 return (short)n; 114 } 115 116 public static int littleEndianToInt(byte[] bs, int off) 117 { 118 int n = bs[ off] & 0xff; 119 n |= (bs[++off] & 0xff) << 8; 120 n |= (bs[++off] & 0xff) << 16; 121 n |= bs[++off] << 24; 122 return n; 123 } 124 125 public static void littleEndianToInt(byte[] bs, int off, int[] ns) 126 { 127 for (int i = 0; i < ns.length; ++i) 128 { 129 ns[i] = littleEndianToInt(bs, off); 130 off += 4; 131 } 132 } 133 134 public static void littleEndianToInt(byte[] bs, int bOff, int[] ns, int nOff, int count) 135 { 136 for (int i = 0; i < count; ++i) 137 { 138 ns[nOff + i] = littleEndianToInt(bs, bOff); 139 bOff += 4; 140 } 141 } 142 143 public static int[] littleEndianToInt(byte[] bs, int off, int count) 144 { 145 int[] ns = new int[count]; 146 for (int i = 0; i < ns.length; ++i) 147 { 148 ns[i] = littleEndianToInt(bs, off); 149 off += 4; 150 } 151 return ns; 152 } 153 154 public static byte[] shortToLittleEndian(short n) 155 { 156 byte[] bs = new byte[2]; 157 shortToLittleEndian(n, bs, 0); 158 return bs; 159 } 160 161 public static void shortToLittleEndian(short n, byte[] bs, int off) 162 { 163 bs[ off] = (byte)(n ); 164 bs[++off] = (byte)(n >>> 8); 165 } 166 167 public static byte[] intToLittleEndian(int n) 168 { 169 byte[] bs = new byte[4]; 170 intToLittleEndian(n, bs, 0); 171 return bs; 172 } 173 174 public static void intToLittleEndian(int n, byte[] bs, int off) 175 { 176 bs[ off] = (byte)(n ); 177 bs[++off] = (byte)(n >>> 8); 178 bs[++off] = (byte)(n >>> 16); 179 bs[++off] = (byte)(n >>> 24); 180 } 181 182 public static byte[] intToLittleEndian(int[] ns) 183 { 184 byte[] bs = new byte[4 * ns.length]; 185 intToLittleEndian(ns, bs, 0); 186 return bs; 187 } 188 189 public static void intToLittleEndian(int[] ns, byte[] bs, int off) 190 { 191 for (int i = 0; i < ns.length; ++i) 192 { 193 intToLittleEndian(ns[i], bs, off); 194 off += 4; 195 } 196 } 197 198 public static long littleEndianToLong(byte[] bs, int off) 199 { 200 int lo = littleEndianToInt(bs, off); 201 int hi = littleEndianToInt(bs, off + 4); 202 return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); 203 } 204 205 public static void littleEndianToLong(byte[] bs, int off, long[] ns) 206 { 207 for (int i = 0; i < ns.length; ++i) 208 { 209 ns[i] = littleEndianToLong(bs, off); 210 off += 8; 211 } 212 } 213 214 public static byte[] longToLittleEndian(long n) 215 { 216 byte[] bs = new byte[8]; 217 longToLittleEndian(n, bs, 0); 218 return bs; 219 } 220 221 public static void longToLittleEndian(long n, byte[] bs, int off) 222 { 223 intToLittleEndian((int)(n & 0xffffffffL), bs, off); 224 intToLittleEndian((int)(n >>> 32), bs, off + 4); 225 } 226 227 public static byte[] longToLittleEndian(long[] ns) 228 { 229 byte[] bs = new byte[8 * ns.length]; 230 longToLittleEndian(ns, bs, 0); 231 return bs; 232 } 233 234 public static void longToLittleEndian(long[] ns, byte[] bs, int off) 235 { 236 for (int i = 0; i < ns.length; ++i) 237 { 238 longToLittleEndian(ns[i], bs, off); 239 off += 8; 240 } 241 } 242 } 243