2006/08/09(水)Perlによるbase64エンコード/デコードの実装

エンコード

MIME::Base64(C実装)を使えば速いのですが、メールのタイトル程度でそこまでする必要はないし*1、かと言って日本で有名な某MIMEルーチンは、巨大変換テーブルという非効率な実装なので、自作した奴。

# テーブル
my $base64table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
# 変換処理
$subject =~ s/(\e\$[\@B].*?\e\([BJ])/ '=?ISO-2022-JP?B?' . &base64encode($1) . '?=' /eg;

sub base64encode {
	my $str = shift;
	my $table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
	my $ret;

	# 2 : 0000_0000 1111_1100
	# 4 : 0000_0011 1111_0000
	# 6 : 0000_1111 1100_0000
	my ($i, $j, $x, $y);
	for($i=$x=0, $j=2; $i<length($str); $i++) {
		$x    = ($x<<8) + ord(substr($str,$i,1));
		$ret .= substr($table, ($x>>$j) & 0x3f, 1);

		if ($j != 6) { $j+=2; next; }
		# j==6
		$ret .= substr($table, $x & 0x3f, 1);
		$j    = 2;
	}
	if ($j != 2)    { $ret .= substr($table, ($x<<(8-$j)) & 0x3f, 1); }
	if ($j == 4)    { $ret .= '=='; }
	elsif ($j == 6) { $ret .= '=';  }

	return $ret;
}

*1 : Perlは外部モジュールロードが速くない

デコード

# テーブル
my @base64ary = (
 0, 0, 0, 0,  0, 0, 0, 0,   0, 0, 0, 0,  0, 0, 0, 0,	# 0x00~0x1f
 0, 0, 0, 0,  0, 0, 0, 0,   0, 0, 0, 0,  0, 0, 0, 0,	# 0x10~0x1f
 0, 0, 0, 0,  0, 0, 0, 0,   0, 0, 0,62,  0, 0, 0,63,	# 0x20~0x2f
52,53,54,55, 56,57,58,59,  60,61, 0, 0,  0, 0, 0, 0,	# 0x30~0x3f
 0, 0, 1, 2,  3, 4, 5, 6,   7, 8, 9,10, 11,12,13,14,	# 0x40~0x4f
15,16,17,18, 19,20,21,22,  23,24,25, 0,  0, 0, 0, 0,	# 0x50~0x5f
 0,26,27,28, 29,30,31,32,  33,34,35,36, 37,38,39,40,	# 0x60~0x6f
41,42,43,44, 45,46,47,48,  49,50,51, 0,  0, 0, 0, 0	# 0x70~0x7f
);
# デコード処理
$subject =~ s/=\?ISO-2022-JP\?B\?([A-Za-z0-9\+\/=]*)\?=/ &base64decode($1) /eg;

sub base64decode {
	my $str  = shift;

	my $ret;
	my $buf;
	my $f;
	if (substr($str, -1) eq  '=') { $f=1; }
	if (substr($str, -2) eq '==') { $f=2; }
	for(my $i=0; $i<length($str); $i+=4) {
		$buf  = ($buf<<6) + $base64ary[ ord(substr($str,$i  ,1)) ];
		$buf  = ($buf<<6) + $base64ary[ ord(substr($str,$i+1,1)) ];
		$buf  = ($buf<<6) + $base64ary[ ord(substr($str,$i+2,1)) ];
		$buf  = ($buf<<6) + $base64ary[ ord(substr($str,$i+3,1)) ];
		$ret .= chr(($buf & 0xff0000)>>16) . chr(($buf & 0xff00)>>8) . chr($buf & 0xff);

	}
	if ($f>0) { chop($ret); }
	if ($f>1) { chop($ret); }
	return $ret;
}

ライセンス

修正BSDで。

歴代PCメモ

はてブ数 2000/03/01メモPC

古いもの

CF-SZ6, Core i5 7200U, LPDDR3 8GB

CF-SZ6.png
crucial_MX300_525GB.png

  • CPU : Core i5 7200U / 2.5GHz / 2C4T / Kaby Lake-U
  • RAM : LPDDR3 8GB
  • SSD : CT525MX300SSD1 / Crucial MX300 525GB / SATA / 160TBW / TLC
  • GPU : Intel HD Graphics 620
  • Cinebench R23: 1781/732 (AC電源)
  • DQ10ベンチ 1280x720フルスクリーン 標準画質
    • GPU電源プラン 省電力:5983 バランス:7393 最大:8159
2017年5月購入。

Ryzen 4750G, DDR4 3600MHz 16GB

Ryzen 4750G.png
WD Blue SN550 NVMe 1TB.png

  • CPU: Ryzen 4750G / 3.6GHz / 8C16T / zen2 Renoir
  • M/B: ASRock A520M-HDV
  • RAM: PVS416G360C7K / Patriot Viper Steel DDR4 3600MHz CL17 8GB x 2
  • SSD: WDS100T2B0C-EC / WD Blue SN550 NVMe 1TB / 600TBW / TLC / PCIe3.0
  • GPU: Radeon Graphics 8
  • Cinebench R20: 4782
  • Cinebench R23: 12408/1305
  • iGPU VRAM: 2GB
    • DQ10ベンチ Ver1.5 1920x1080 最高画質: 12142
    • FF14暁月のフィナーレ 1920x1080 最高品質: 3806
  • アイドル時電力: AMD Ryzen Balanced 15W / 省電力 11W
    • BIOS設定 Global C-State Control: Auto
2020年9月28日。

HP ProDesk 600 G4 SFF, Radeon RX 6400, DDR4 16GB

ProDesk-600.png
ProDesk-600_ssd.png

  • メーカー: HP ProDesk 600 G4 SFF
  • CPU: Core i5 8500 / 3.0GHz / 6C6T / Coffee Lake
  • RAM: DDR4 2666 8GBx2*1
  • SSD: LEGEND 800 ALEG-800-1000GCS / 1TB / 600TBW / TLC / PCIe4.0 (PICe3.0接続)
  • GPU: SAPPHIRE PULSE Radeon RX 6400 GDDR6 4GB (PICe3.0接続)
  • Cinebench R20: 2226
  • Cinebench R23: 5530/1058
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 8521
  • FF14暁月のフィナーレ 1920x1080 最高品質: 9675
  • Intel UHD Graphics 630 使用
    • DQ10ベンチ Ver1.5 1920x1080 最高画質: 6151
    • FF14暁月のフィナーレ 1920x1080 最高品質: 1170
  • アイドル時電力: 14W / グラボなし: 9W
2022年9月4日。DQ10ベンチが苦手(GPU使用率が60%ぐらい)でスコアが伸びず。

*1 : 元々の8GBメモリに、シリコンパワー1.2V CL19 SP008GBLFU266B02 2666 8GBを追加。

HP EliteDesk 800 G4 DM, DDR4 16GB

EliteDesk_800_G4_8500T_01.png
EliteDesk_800_G4_8500T_02.png

  • CPU: Core i5 8500T / 3.0GHz / 6C6T / Coffee Lake
  • RAM: DDR4 2666 8GB + CFD DDR4 3200 8GB
  • SSD: Western Digital CL SN520 SDAPNUW-256G / 256GB / 200TBW / PCIe3.0x2
  • Cinebench R20: 1647
  • Cinebench R23: 4243/880
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 5031
  • FF14暁月のフィナーレ 1920x1080 最高品質: 1037
2024年3月購入。アイドル時8W。いわゆるミニPC。

Beelink MINI S12 Pro N100, DDR4 16GB

Intel-N100.jpg
Intel-N100_ssd.png

  • ミニPC: Beelink MINI S12 Pro
  • CPU: Intel N100 / 3.4GHz / 4C4T / Alder Lake-N
  • RAM: DDR4 3200 16GB
  • SSD: AZW 512G / NVMe 512GB / MAP1202搭載 / PCIe3.0x1接続
  • Cinebench R20: 1121
  • Cinebench R23: 2921/932
  • Intel UHD Graphics
    • DQ10ベンチ Ver1.5 1920x1080 最高品質: 6320
    • FF14暁月のフィナーレ 1920x1080 最高品質: 998
    • FF14暁月のフィナーレ 1920x1080 標準PC: 2258
  • アイドル時6W(Windows11/Linux)。Cinebench中24W。FF14ベンチ30W→25W。
    • BIOS: Advacnced→Power→GT→RC6 Enable。これがオフだとアイドル8W。
Linuxサーバ化。
  • NVMe: MS950G75PCIe4-02TB / 2TB / 2000TBW / TLC / PCIe4.0対応
  • SATA: CT2000BX500SSD1JP 2000GB / 2TB / 720TBW / TLC
2023年7月1日。レビュー記事。付属SSD性能はPCIe3.0x4接続ならもっと速い(↓)。

Core i3 12100F, GeForce RTX4700 12GB, DDR4 64GB

12100F.png
12100F_ssd.png

  • CPU: Core i3 12100F / TDP:58W,89W / 4C8T / Alder Lake-S
  • M/B: ASRock B660M Phantom Gaming 4
  • RAM: PVB464G360C8K / Patriot DDR4 3600 32GBx2
  • SSD: AZW 512G(MINI S12 Pro付属) / MAP1202搭載 / PCIe3.0x4接続
  • GPU: GV-N4070WF3OC-12GD / GIGABYTE GeForce RTX4700 GDDR6X 12GB(流用)
  • Cinebench R20: 3179
  • Cinebench R23: 8269/1621
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 22858
  • FF14暁月のフィナーレ 1920x1080 最高品質: 24225
  • アイドル時電力 Windows:34W, Linux:37W
2023年7月7日。ゲームマシンではなくAI用サーバ。

電源のアイドル電流メモ

PS-ON(GNDと緑の線をショート)させた状態での消費電力メモ。
電源最大80PLUSアイドル電流
Antec EA-380D Green380W2W
Aopen AO300-08TE8(H360K-300BK付属)300W3W
玄人志向 KRPW-TX300W/90+300W3W
※EA-380D Greenの電源ファン: ADDA AD0812HS-A70GL 12V 0.25A 38.6CFM 80mm角×25mm*2

メモ

  • Surface Pro 5 1796
    • Core i5-7300U / 2.6GHz / 2C4T / Kaby Lake-U
    • Intel HD Graphics 620
    • RAM 8GB
    • SSD 256GB