繁体   English   中英

二进制到文本的编码,将一个字节替换为 golang 中预定义的唯一字符串

[英]binary-to-text encoding that replace a byte into a predefined unique string in golang

我正在尝试构建一个二进制到文本的编码器,能够将每个字节替换为预定义的唯一字符串,然后使用相同的字符串集解码回二进制。

我能够为 simple.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
}

是nodejs中的一个类似的。

两件事情:

  • 您正在正确处理空格,但不是换行符。
  • 你的解码器循环是错误的。 据我所知,它应该如下所示:
for i, key := range keys {
   if string(current)==key {
     decoded=append(decoded,i)
     break
   }
}

此外,您decoded的是一个 int 数组,而不是一个字节数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM