как получить исходный размер файла из строки кодирования base64 - PullRequest
0 голосов
/ 15 мая 2019

Я хочу получить размер исходного файла из строковой переменной, которая получается с помощью файла кодирования base64.



package main

import (
    "bufio"
    "encoding/base64"
    "io/ioutil"
    "os"
)

func encodeFile(file string) string {
    f, err := os.Open(file)
    if err != nil {
        panic(err)
    }

    reader := bufio.NewReader(f)
    content, _ := ioutil.ReadAll(reader)
    encoded := base64.StdEncoding.EncodeToString(content)
    return encoded
}

func main() {
    datas := encodeFile("/tmp/hello.json")
    //how to get  file size from datas
}

как получить размер файла от datas? Thks.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Это должно сделать это:

func calcOrigBinaryLength(datas string) int {

    l := len(datas)

    // count how many trailing '=' there are (if any)
    eq := 0
    if l >= 2 {
        if datas[l-1] == '=' {
            eq++
        }
        if datas[l-2] == '=' {
            eq++
        }

        l -= eq
    }

    // basically:
    //
    // eq == 0 :    bits-wasted = 0
    // eq == 1 :    bits-wasted = 2
    // eq == 2 :    bits-wasted = 4

    // each base64 character = 6 bits

    // so orig length ==  (l*6 - eq*2) / 8

    return (l*3 - eq) / 4
}

Проверка игровой площадки: https://play.golang.org/p/Y4v102k74V5

0 голосов
/ 15 мая 2019

Ну, строка в кодировке base64 имеет длину, отличную от исходного файла.Чтобы получить исходный размер, вы можете сделать следующее: 1. В функции encodeFile вернуть len(content), который является размером исходного файла.

ИЛИ вы можете рассчитать размер файла по следующей формуле:

x = (n * (3/4)) - y Где:

  1. x - эторазмер файла в байтах
  2. n равен len(datas)
  3. y будет 2, если Base64 оканчивается на '==', и 1, если Base64 оканчивается на '='.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...