回答編集履歴

8

修正

2020/04/23 15:15

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  - その結果4のバイト倍数ずつ読み込むと改行コードも4バイトに含まれてしまい、Base64の1セットが崩れてしまう
50
50
 
51
- - bufferSizeがファイルより大きい場合は改行コードも合わせてデコード出来るので問題ない(base64_decode()が上手く判定している気がする)
51
+ - bufferSizeがファイルより大きい場合は改行コードも合わせてデコード出来るので問題ない(base64_decode()が上手く判定する)
52
52
 
53
53
 
54
54
 
@@ -58,9 +58,7 @@
58
58
 
59
59
  ---
60
60
 
61
- 1. 一回の読み込みを76の倍数にする
62
-
63
- 2. 一回の読み込みを(76バイト+改行コード)の倍数のバイト数にして、改行コードbase64_decode()に処理させる
61
+ 1. 一回の読み込みを(76バイト+改行コード)の倍数のバイト数にし改行コードも含めてbase64_decode()に処理させる
64
62
 
65
63
 
66
64
 

7

追記

2020/04/23 15:15

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -6,7 +6,45 @@
6
6
 
7
7
  ---
8
8
 
9
- - zipをbase64エンコードすると76バイト毎に改行コードが挿入される(Base64の仕様(shouldなので必須では無い))
9
+ - base64エンコードすると76バイト毎に改行コードが挿入される(Base64の仕様(必須では無いがMIMEの仕様に合わせるためにデフォルトではそうなる実装が多いっぽい?))
10
+
11
+
12
+
13
+ [RFC The Base16, Base32, and Base64 Data Encodings](https://tools.ietf.org/html/rfc4648)
14
+
15
+
16
+
17
+
18
+
19
+ > 3.1. Line Feeds in Encoded Data
20
+
21
+ >
22
+
23
+ > MIME [4] is often used as a reference for base 64 encoding. However,
24
+
25
+ > MIME does not define "base 64" per se, but rather a "base 64 Content-
26
+
27
+ > Transfer-Encoding" for use within MIME. As such, MIME enforces a
28
+
29
+ > limit on line length of base 64-encoded data to 76 characters. MIME
30
+
31
+ > inherits the encoding from Privacy Enhanced Mail (PEM) [3], stating
32
+
33
+ > that it is "virtually identical"; however, PEM uses a line length of
34
+
35
+ > 64 characters. The MIME and PEM limits are both due to limits within
36
+
37
+ > SMTP.
38
+
39
+ >
40
+
41
+ > Implementations MUST NOT add line feeds to base-encoded data unless
42
+
43
+ > the specification referring to this document explicitly directs base
44
+
45
+ > encoders to add line feeds after a specific number of characters.
46
+
47
+
10
48
 
11
49
  - その結果4のバイト倍数ずつ読み込むと改行コードも4バイトに含まれてしまい、Base64の1セットが崩れてしまう
12
50
 

6

追記

2020/04/23 15:14

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -50,6 +50,8 @@
50
50
 
51
51
  //MIMEに合わせて一回で読むバイト数を決め打ち。合計値をn倍してもOK。
52
52
 
53
+ //ここではエンコード環境がlinuxなので改行コードがLF(1バイト)になっているが、エンコード環境によってはCRLF(2バイト)になるはずなので、扱いたいファイルの仕様に合わせて変更する
54
+
53
55
  $bufferSize = 76+strlen(PHP_EOL);
54
56
 
55
57
  while(!feof($file)){

5

MIMEに対する誤記を修正

2020/04/23 15:09

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  ---
8
8
 
9
- - zipをbase64エンコードすると76バイト毎に改行コードが挿入される(MIMEの仕様)
9
+ - zipをbase64エンコードすると76バイト毎に改行コードが挿入される(Base64の仕様(shouldなので必須では無い)
10
-
10
+
11
- - その結果4バイトずつ読み込むと改行コードも4バイトに含まれてしまい、base64のセットが崩れてしまう
11
+ - その結果4バイト倍数ずつ読み込むと改行コードも4バイトに含まれてしまい、Base64の1セットが崩れてしまう
12
12
 
13
13
  - bufferSizeがファイルより大きい場合は改行コードも合わせてデコード出来るので問題ない(base64_decode()が上手く判定している気がする)
14
14
 

4

修正

2020/04/23 15:05

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  1. 一回の読み込みを76の倍数にする
24
24
 
25
- 2. 一回の読み込み辺り、76バイトの倍数+改行コードを含めたバイト数を読み込んで、base64_decode()に処理させる
25
+ 2. 一回の読み込みを(76バイト+改行コード)の倍数のバイト数にして改行コードはbase64_decode()に処理させる
26
26
 
27
27
 
28
28
 

3

環境追記

2020/04/23 15:01

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -1,4 +1,4 @@
1
- 興味があったので手元のdebianで試してみたところ、スマートでは無いですが解決できたので回答します。
1
+ 興味があったので手元のRaspbianで試してみたところ、スマートでは無いですが解決できたので回答します。
2
2
 
3
3
 
4
4
 
@@ -82,6 +82,26 @@
82
82
 
83
83
 
84
84
 
85
+ PHPのバージョン(検証していませんが、PHP5.5でも動くと思う)
86
+
87
+ ```bash
88
+
89
+ $ php -v
90
+
91
+ PHP 7.3.11-1~deb10u1 (cli) (built: Oct 26 2019 14:14:18) ( NTS )
92
+
93
+ Copyright (c) 1997-2018 The PHP Group
94
+
95
+ Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
96
+
97
+ with Zend OPcache v7.3.11-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies
98
+
99
+
100
+
101
+ ```
102
+
103
+
104
+
85
105
  テキストファイルの作成
86
106
 
87
107
  UTF-8で`test.txt`を作成

2

修正

2020/04/23 14:59

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -96,15 +96,23 @@
96
96
 
97
97
  zip化
98
98
 
99
+ ```bash
100
+
99
- `$ zip test.zip test.txt
101
+ $ zip test.zip test.txt
100
102
 
101
103
  adding: test.txt (deflated 38%)`
104
+
105
+ ```
102
106
 
103
107
 
104
108
 
105
109
  base64dにエンコード
106
110
 
111
+ ```bash
112
+
107
- `$ base64 test.zip > test.bat`
113
+ $ base64 test.zip > test.bat`
114
+
115
+ ```
108
116
 
109
117
 
110
118
 

1

追記

2020/04/23 14:56

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -20,7 +20,9 @@
20
20
 
21
21
  ---
22
22
 
23
+ 1. 一回の読み込みを76の倍数にする
24
+
23
- 76バイト毎に改行が入ること見越して改行分を読み捨てる(base64自体は改行コードは必要としない)
25
+ 2. 一回の読み込み辺り、76バイトの倍数+改行コード含めたバイト数を読み込んで、base64_decode()に処理させる
24
26
 
25
27
 
26
28
 
@@ -46,9 +48,9 @@
46
48
 
47
49
  if($file = fopen($localFile , 'rb')){
48
50
 
49
- //MIMEに合わせて一回で読むバイト数を決め打ち。76の数ならなんでいけるはず
51
+ //MIMEに合わせて一回で読むバイト数を決め打ち。合計値をnしてOK
50
52
 
51
- $bufferSize = 76;
53
+ $bufferSize = 76+strlen(PHP_EOL);
52
54
 
53
55
  while(!feof($file)){
54
56