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

二进制到文本编码,将字节替换为golang中预定义的唯一字符串,go,encoding,byte,decoding,Go,Encoding,Byte,Decoding,我正在尝试构建一个二进制到文本编码器,它能够将每个字节替换为预定义的唯一字符串,然后使用相同的字符串集解码回二进制 我能够为简单的.txt文件制作编码器和解码器,但我想让它也适用于.zip文件 编码器: package main import ( "archive/zip" "bufio" "encoding/json" "fmt" "io/ioutil" "log" "os" "strings" ) func main() {

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

我能够为简单的.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中也是类似的。有两件事:

  • 您正确地处理了空格,但没有处理换行符
  • 你的解码器循环是错误的。据我所知,应该是这样的:
另外,解码的
是一个int数组,而不是字节数组。

两件事:

  • 您正确地处理了空格,但没有处理换行符
  • 你的解码器循环是错误的。据我所知,应该是这样的:

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

是的,您是对的,现在的问题是我需要再次从该int数组生成.zip文件,您对此有何想法?将decoded设为[]字节,并使用decoded=append(decoded,byte(I))。您可以将该[]字节写入zip文件。顺便说一句,您可以使用encoding.base64来完成此操作。正如您所知,在编码时,.zip文件中可能有多个文件,但当我在解码时将[]字节写入.zip文件时,它只在.zip文件中生成一个文件,而我想要的是完全相同的文件,如果您可以共享encoding.base64方法,这将非常有帮助。您正在将所有文件解码为一个单字节数组。档案之间没有界限。您必须修复解码器以确定文件边界。对于base64编码,请查看encoding/base64包,它是一个标准库包。这是一种将二进制数据编码为文本的常用标准方法。是的,你说得对,现在的问题是我需要再次从int数组生成.zip文件,你对此有何想法?将decoded设为[]字节,并使用decoded=append(decoded,byte(I))。您可以将该[]字节写入zip文件。顺便说一句,您可以使用encoding.base64来完成此操作。正如您所知,在编码时,.zip文件中可能有多个文件,但当我在解码时将[]字节写入.zip文件时,它只在.zip文件中生成一个文件,而我想要的是完全相同的文件,如果您可以共享encoding.base64方法,这将非常有帮助。您正在将所有文件解码为一个单字节数组。档案之间没有界限。您必须修复解码器以确定文件边界。对于base64编码,请查看encoding/base64包,它是一个标准库包。这是一种将二进制数据编码为文本的常用标准方法。
for i, key := range keys {
   if string(current)==key {
     decoded=append(decoded,i)
     break
   }
}