Skip to content

Instantly share code, notes, and snippets.

@mpfund
Last active August 29, 2015 14:16
Show Gist options
  • Save mpfund/267f951c8dfb1ca9f4ca to your computer and use it in GitHub Desktop.
Save mpfund/267f951c8dfb1ca9f4ca to your computer and use it in GitHub Desktop.
find_strings
package main;
import (
"fmt"
"flag"
"bufio"
"os"
"errors"
)
var fileName = flag.String("f", "", "filename")
var unicodeOnly = flag.Bool("u", false, "unicode")
var minLength = 4;
var textUtf = "";
var textAscii = "";
var rangeStart = 0x20;
var rangeEnd = 0x7e
var rangeAdditional map[int]bool = make(map[int]bool)
func main(){
flag.Parse();
file, err := os.Open(*fileName)
if err!=nil {
panic(err)
}
defer file.Close()
r := bufio.NewReader(file)
var bcount int64 = 0
fileUtf, err := os.Create("out.txt");
if err != nil{
fmt.Println(err.Error())
return;
}
futf := bufio.NewWriter(fileUtf);
defer futf.Flush()
defer fileUtf.Close()
var utfBuffer = []byte{}
rangeAdditional[0xe4] = true;
rangeAdditional[0xf6] = true;
rangeAdditional[0xfc] = true;
rangeAdditional[0xdc] = true;
rangeAdditional[0xc4] = true;
rangeAdditional[0xd6] = true;
for true {
b1, err := r.ReadByte();
if err != nil {
PrintText(futf,textUtf)
PrintText(futf,textAscii)
fmt.Println(err.Error())
break;
}
utfBuffer = append(utfBuffer, b1)
if len(utfBuffer) == 2 {
letterUtf, errUtf:= checkChar(utfBuffer)
if errUtf == nil {
textUtf += letterUtf
} else{
PrintText(futf,textUtf)
textUtf=""
}
utfBuffer = utfBuffer[:0]
}
if(*unicodeOnly != true){
letterAscii, errAscii:= checkChar([]byte{b1})
if errAscii == nil {
textAscii += letterAscii
} else {
PrintText(futf,textAscii)
textAscii = ""
}
}
bcount+=1;
}
fmt.Printf("done, read %d bytes", bcount)
}
func checkChar(bytes []byte) (letter string, err error) {
var letterInt = toInt(bytes)
if letterInt >= rangeStart && letterInt <= rangeEnd {
return string(letterInt),nil
}
_, ok := rangeAdditional[letterInt]
if ok {
return string(letterInt),nil
}
return "", errors.New("garbage")
}
func PrintText(f *bufio.Writer, text string){
if len(text) >= minLength{
//fmt.Println(text)
f.WriteString(text)
f.WriteString("\n")
}
}
func toInt(bytes []byte) int{
var num int = 0;
var maxBytes = len(bytes);
if maxBytes > 4 {
maxBytes = 4
}
for k:=0;k<maxBytes;k++ {
num += int(bytes[k]) << (uint(maxBytes-k-1)*8);
}
return num;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment