TypeScript 1.6 で Base64 encode/decode
TypeScriptでBase64変換するプログラムです。 elm200 の日記のJavascript で Base64 encode/decodeで公開されているパブリックドメインなコードを勝手にTypeScriptに変換して使っていたのですが、他の用途にも使えそうだったので公開することにしました。 変更点は以下のとおりです。 * TypeScript 1.6でビルドできるようにした。 * 元のコードではグローバル変数lenに値が代入されることがあったので、var を追加した。 元の製作者リスペクトで、このコードのライセンスはpublic domain(著作権放棄)&無保証とします。 ダウンロードはこちら。
/**
* Base64 encoding
* http://www.ietf.org/rfc/rfc2045.txt
*/
class Base64
{
private symbols: string[] = [];
private encodeMap: string[] = [];
private decodeMap: { [id: string]: number } = {};
public constructor()
{
this.initialize();
}
private initialize(): void
{
var startChar = "A".charCodeAt(0);
for (var i = 0; i < 26; i++)
{
this.symbols.push(String.fromCharCode(startChar + i));
}
var startChar = "a".charCodeAt(0);
for (var i = 0; i < 26; i++)
{
this.symbols.push(String.fromCharCode(startChar + i));
}
var startChar = "0".charCodeAt(0);
for (var i = 0; i < 10; i++)
{
this.symbols.push(String.fromCharCode(startChar + i));
}
this.symbols.push("+", "/");
this.encodeMap = [];
for (var i = 0; i < this.symbols.length; i++)
{
this.encodeMap[i] = this.symbols[i];
}
this.decodeMap = {};
for (var i = 0; i < this.symbols.length; i++)
{
this.decodeMap[this.symbols[i]] = i;
}
this.decodeMap["="] = null;
}
public encode(octets: number[]): string
{
var i: number, len: number;
var map = this.encodeMap;
var encoded: string[] = [];
for (i = 0, len = Math.floor(octets.length / 3) * 3;
i < len; i += 3)
{
var b0 = octets[i];
var b1 = octets[i + 1];
var b2 = octets[i + 2];
var qs = map[(b0 >> 2) & 0x3f]
+ map[((b0 << 4) + (b1 >> 4)) & 0x3f]
+ map[((b1 << 2) + (b2 >> 6)) & 0x3f]
+ map[b2 & 0x3f];
encoded.push(qs);
}
switch (octets.length % 3)
{
case 1:
var b0 = octets[i];
var qs = map[(b0 >> 2) & 0x3f]
+ map[(b0 << 4) & 0x3f]
+ "==";
encoded.push(qs);
break;
case 2:
var b0 = octets[i];
var b1 = octets[i + 1];
var qs = map[(b0 >> 2) & 0x3f]
+ map[((b0 << 4) + (b1 >> 4)) & 0x3f]
+ map[(b1 << 2) & 0x3f]
+ "=";
encoded.push(qs);
break;
}
return encoded.join("");
}
public decode(encoded: string): number[]
{
if (encoded.length % 4 != 0)
{
throw "encoded.length must be a multiple of 4.";
}
var decoded: number[] = [];
var map = this.decodeMap;
for (var i = 0, len = encoded.length; i < len; i += 4)
{
var b0 = map[encoded[i]];
var b1 = map[encoded[i + 1]];
var b2 = map[encoded[i + 2]];
var b3 = map[encoded[i + 3]];
var d0 = ((b0 << 2) + (b1 >> 4)) & 0xff;
decoded.push(d0);
if (b2 == null) break; // encoded[i + 1] == "="
var d1 = ((b1 << 4) + (b2 >> 2)) & 0xff;
decoded.push(d1);
if (b3 == null) break; // encoded[i + 2] == "="
var d2 = ((b2 << 6) + b3) & 0xff;
decoded.push(d2);
}
return decoded;
}
public uriEncodedToOctets(uriEncoded: string): number[]
{
var octets: number[] = [];
for (var i = 0, len = uriEncoded.length; i < len; i++)
{
// Note that IE6 doesn't allow an expression like "uriEncoded[i]";
var c = uriEncoded.charAt(i);
var b: number;
if (c == "%")
{
var hex = uriEncoded.charAt(++i) + uriEncoded.charAt(++i);
b = parseInt(hex, 16);
} else
{
b = c.charCodeAt(0);
}
octets.push(b);
}
return octets;
}
public encodeStringAsUTF8(utf8str: string): string
{
var uriEncoded = encodeURIComponent(utf8str);
var octets = this.uriEncodedToOctets(uriEncoded);
return this.encode(octets);
}
public octetsToUriEncoded(octets: number[]): string
{
var uriEncoded: string[] = [];
for (var i = 0, len = octets.length; i < len; i++)
{
var hex = octets[i].toString(16);
hex = ("0" + hex).substr(hex.length - 1, 2);
uriEncoded.push("%" + hex);
}
return uriEncoded.join("");
}
public decodeStringAsUTF8(encoded: string): string
{
var octets = this.decode(encoded);
var uriEncoded = this.octetsToUriEncoded(octets);
return decodeURIComponent(uriEncoded);
}
}
var base64:Base64 = new Base64();
最終更新: 2022/12/29 17:36


