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