]>
Commit | Line | Data |
---|---|---|
1 | // Licensed to the Apache Software Foundation(ASF) under one | |
2 | // or more contributor license agreements.See the NOTICE file | |
3 | // distributed with this work for additional information | |
4 | // regarding copyright ownership.The ASF licenses this file | |
5 | // to you under the Apache License, Version 2.0 (the | |
6 | // "License"); you may not use this file except in compliance | |
7 | // with the License. You may obtain a copy of the License at | |
8 | // | |
9 | // http://www.apache.org/licenses/LICENSE-2.0 | |
10 | // | |
11 | // Unless required by applicable law or agreed to in writing, | |
12 | // software distributed under the License is distributed on an | |
13 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
14 | // KIND, either express or implied. See the License for the | |
15 | // specific language governing permissions and limitations | |
16 | // under the License. | |
17 | ||
18 | using System; | |
19 | ||
20 | namespace Thrift.Protocols.Utilities | |
21 | { | |
22 | // ReSharper disable once InconsistentNaming | |
23 | internal static class TBase64Utils | |
24 | { | |
25 | //TODO: Constants | |
26 | //TODO: Check for args | |
27 | //TODO: Unitests | |
28 | ||
29 | internal const string EncodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
30 | ||
31 | private static readonly int[] DecodeTable = | |
32 | { | |
33 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
34 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
35 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, | |
36 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, | |
37 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | |
38 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, | |
39 | -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, | |
40 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, | |
41 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
42 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
43 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
44 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
45 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
46 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
47 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
48 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 | |
49 | }; | |
50 | ||
51 | internal static void Encode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) | |
52 | { | |
53 | if (src == null) | |
54 | { | |
55 | throw new ArgumentNullException(nameof(src)); | |
56 | } | |
57 | ||
58 | dst[dstOff] = (byte) EncodeTable[(src[srcOff] >> 2) & 0x3F]; | |
59 | ||
60 | if (len == 3) | |
61 | { | |
62 | dst[dstOff + 1] = (byte) EncodeTable[((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)]; | |
63 | dst[dstOff + 2] = (byte) EncodeTable[((src[srcOff + 1] << 2) & 0x3C) | ((src[srcOff + 2] >> 6) & 0x03)]; | |
64 | dst[dstOff + 3] = (byte) EncodeTable[src[srcOff + 2] & 0x3F]; | |
65 | } | |
66 | else if (len == 2) | |
67 | { | |
68 | dst[dstOff + 1] = (byte) EncodeTable[((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)]; | |
69 | dst[dstOff + 2] = (byte) EncodeTable[(src[srcOff + 1] << 2) & 0x3C]; | |
70 | } | |
71 | else | |
72 | { | |
73 | // len == 1 | |
74 | dst[dstOff + 1] = (byte) EncodeTable[(src[srcOff] << 4) & 0x30]; | |
75 | } | |
76 | } | |
77 | ||
78 | internal static void Decode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) | |
79 | { | |
80 | if (src == null) | |
81 | { | |
82 | throw new ArgumentNullException(nameof(src)); | |
83 | } | |
84 | ||
85 | dst[dstOff] = (byte) ((DecodeTable[src[srcOff] & 0x0FF] << 2) | (DecodeTable[src[srcOff + 1] & 0x0FF] >> 4)); | |
86 | ||
87 | if (len > 2) | |
88 | { | |
89 | dst[dstOff + 1] = | |
90 | (byte) | |
91 | (((DecodeTable[src[srcOff + 1] & 0x0FF] << 4) & 0xF0) | (DecodeTable[src[srcOff + 2] & 0x0FF] >> 2)); | |
92 | if (len > 3) | |
93 | { | |
94 | dst[dstOff + 2] = | |
95 | (byte) | |
96 | (((DecodeTable[src[srcOff + 2] & 0x0FF] << 6) & 0xC0) | DecodeTable[src[srcOff + 3] & 0x0FF]); | |
97 | } | |
98 | } | |
99 | } | |
100 | } | |
101 | } |