二进制到文本编码,将字节替换为golang中预定义的唯一字符串
我正在尝试构建一个二进制到文本编码器,它能够将每个字节替换为预定义的唯一字符串,然后使用相同的字符串集解码回二进制 我能够为简单的.txt文件制作编码器和解码器,但我想让它也适用于.zip文件 编码器:二进制到文本编码,将字节替换为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() {
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
}
}