двоичное в текстовое кодирование, которое заменяет байт в предопределенную уникальную строку в golang - PullRequest
1 голос
/ 21 октября 2019

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

Я могусделать кодировщик и декодер для простых файлов .txt, но я хочу, чтобы это работало и для файлов .zip.

Кодировщик:

package main

import (
    "archive/zip"
    "bufio"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "strings"
)

func main() {
    // keys.json is a 256 words dictionary for every byte
    keysFile, err := os.Open("keys.json")
    if err != nil {
        log.Printf("unable to read keys.json file , error : %v", err)
        return
    }

    var keys []string

    byteValue, _ := ioutil.ReadAll(keysFile)
    if err := json.Unmarshal(byteValue, &keys); err != nil {
        log.Printf("unable to unmarshal array , error : %v", err)
        return
    }

    Encoder(keys)

}

func listFiles(file *zip.File) ([]byte, error) {
    fileToRead, err := file.Open()
    if err != nil {
        msg := "Failed to open zip %s for reading: %s"
        return nil, fmt.Errorf(msg, file.Name, err)
    }
    b := make([]byte, file.FileInfo().Size())
    fileToRead.Read(b)

    defer fileToRead.Close()

    if err != nil {
        return nil, fmt.Errorf("failed to read zip file : %s for reading , error : %s", file.Name, err)
    }

    return b, nil
}

func Encoder(keys []string) {
    read, err := zip.OpenReader("some.zip")
    if err != nil {
        msg := "Failed to open: %s"
        log.Fatalf(msg, err)
    }
    defer read.Close()

    var encodedBytes []byte
    f, err := os.Create("result.txt")
    w := bufio.NewWriter(f)

    defer f.Close()
    for _, file := range read.File {
        readBytes, err := listFiles(file)
        if err != nil {
            log.Fatalf("Failed to read %s from zip: %s", file.Name, err)
            continue
        }

        for i, b := range readBytes {

            for _, eb := range []byte(keys[b] + " ") {
                encodedBytes = append(encodedBytes, eb)
            }

        }

    }
    _, err = w.Write(encodedBytes)
    if err != nil {
        log.Printf("error :%v", err)
        return
    }
}

Декодер:

    func Decoder(keys []string) {
    inputFile, err := os.Open("result.txt")
    if err != nil {
        log.Printf("unable to read file , error : %v", err)
        return
    }

    inputBytes, _ := ioutil.ReadAll(inputFile)

    var (
        current []byte
        decoded []byte
    )

    for _, c := range inputBytes {
        if c != 32 {
            current = append(current, c)
        } else {

            for i, key := range keys {
                if string(current) == key {
                    decoded = append(decoded, byte(i))
                    break
                }
            }
            current = []byte{}
        }
    }

    // here i want the decoded back into zip file
}

здесь аналогичен узлуjs.

1 Ответ

0 голосов
/ 21 октября 2019

Две вещи:

  • Вы имеете дело с пробелами правильно, но не с переводами строки.
  • Ваш цикл декодера неправильный. Насколько я могу судить, это должно выглядеть следующим образом:
for i, key := range keys {
   if string(current)==key {
     decoded=append(decoded,i)
     break
   }
}

Кроме того, ваш decoded является массивом int, а не байтовым массивом.

...