-
Notifications
You must be signed in to change notification settings - Fork 17
/
Transcoder.cs
73 lines (67 loc) · 2.52 KB
/
Transcoder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/***************************************************************************
* Transcoder.cs
*
* cc-sharp is a library to verify Creative Commons license metadata.
* Copyright (C) 2006 Luke Hoersten
* Written by Luke Hoersten <[email protected]>
*
* The "Encode" method is based on Java code by Robert Kaye and Gordon Mohr
* Public Domain (PD) 2006 The Bitzi Corporation (http://bitzi.com/publicdomain)
* (RFC http://www.faqs.org/rfcs/rfc3548.html)
****************************************************************************/
/* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
using System.Text;
namespace CreativeCommons
{
public class Transcoder
{
private const int IN_BYTE_SIZE = 8;
private const int OUT_BYTE_SIZE = 5;
private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".ToCharArray();
public static string Base32Encode(byte[] data)
{
int i = 0, index = 0, digit = 0;
int current_byte, next_byte;
StringBuilder result = new StringBuilder((data.Length + 7) * IN_BYTE_SIZE / OUT_BYTE_SIZE);
while (i < data.Length)
{
current_byte = (data[i] >= 0) ? data[i] : (data[i] + 256); // Unsign
/* Is the current digit going to span a byte boundary? */
if (index > (IN_BYTE_SIZE - OUT_BYTE_SIZE))
{
if ((i + 1) < data.Length)
next_byte = (data[i + 1] >= 0) ? data[i + 1] : (data[i + 1] + 256);
else
next_byte = 0;
digit = current_byte & (0xFF >> index);
index = (index + OUT_BYTE_SIZE) % IN_BYTE_SIZE;
digit <<= index;
digit |= next_byte >> (IN_BYTE_SIZE - index);
i++;
}
else
{
digit = (current_byte >> (IN_BYTE_SIZE - (index + OUT_BYTE_SIZE))) & 0x1F;
index = (index + OUT_BYTE_SIZE) % IN_BYTE_SIZE;
if (index == 0)
i++;
}
result.Append(alphabet[digit]);
}
return result.ToString();
}
}
}