golang base 64 StdEncodingとURLEncodingピット

5602 ワード

今日はテンセントの通用OCR(Optical Character Recognition、光学文字認識、文字認識)を遊びたいと思っています.公式サイトにはphpとpyの例しかありません.
午後中、最後にbase 64に植えられたことに気づきました
package main

import (
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"net/url"
	"os"
)

func main() {
	//           
	file, _ := os.Open("./images/pic")
	data ,_ := ioutil.ReadAll(file)
	defer file.Close()
	a := base64.StdEncoding.EncodeToString(data)
	fmt.Println(a)
	fmt.Println(url.QueryEscape(a))
	b:=base64.URLEncoding.EncodeToString(data)
	fmt.Println(b)
	fmt.Println(url.QueryEscape(b))
	// stdEncoding,   base64     
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5+fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9/vKGBgYPBg8MRQjmBqA4GlwYG/ob+xo4GBgaHBicOIOXI4MJ/AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg==
	//   url   
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5%2BfkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9%2FvKGBgYPBg8MRQjmBqA4GlwYG%2Fob%2Bxo4GBgaHBicOIOXI4MJ%2FAER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg%3D%3D
	// urlEncoding,      “  ”,        
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5-fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9_vKGBgYPBg8MRQjmBqA4GlwYG_ob-xo4GBgaHBicOIOXI4MJ_AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg==
	//           
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5-fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9_vKGBgYPBg8MRQjmBqA4GlwYG_ob-xo4GBgaHBicOIOXI4MJ_AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg%3D%3D
}


大体説明します
Base64                    ,
     URL、Cookie、            。
  • stdEncodingは標準のbase 64で、これは言うまでもなく
  • base 64は、私たちのデータを52文字の大文字、「/」、「+」、0-9に変換していますが、上にはもう一つの特殊な「=」が見えます.この=上の64人の兄弟姉妹
  • に属していません.
  • base 64符号化第1ステップは、3バイトごとに1つのグループに分けられ、24ビット
  • のグループに分けられる.
  • 第2歩24位のうち6位の前を2つずつ0にすると32位になります(なぜ32位になるのですか?私は今まだ作者がどう思っているのか分かりませんが、当ててみてください.cpuの32位を集めるために)
  • 残りは、2^6が64なので、2ステップ目に1バイトを用意すれば、各バイトを対応する文字に解析すればよい.上は3バイトの1組を言って、それでは3の倍数が足りないのはどうしますか?例えばgbkの「こんにちは」は4バイトで、欠けている2人の兄弟は「=」から頂点に上がったので、「=」は最後に1つか2つしか現れず、数えるのに使われています.なぜ?まだ
  • あるとは知らなかった
  • urlEncodingは、標準的な符号化方法についていくつかの処理を行います.「+」と「/」が誤ってパラメータとしてurlアドレスバーに直接現れると、曖昧になります.その後、urlEncodingというものが後に現れ、彼は「/」を「」に変えました.「+」を「-」に置き換えるとurl符号化によって曖昧にならず、パラメータがパラメータであり、残りは「=」のみで問題があり、接尾辞を省略する解析方法もある.大体そうですが、いくつかのシーンで問題が発生する可能性があります.これは
  • が出てきました.
    まとめ
    base64       ,       64             ,     
              ,                   ,       
        ,         ,        。