mirror of
https://github.com/NotAShelf/hexxy.git
synced 2024-11-22 13:20:49 +00:00
[hexxy] fixed reverse plain
This commit is contained in:
parent
c64950b437
commit
30e0aa5549
2 changed files with 61 additions and 27 deletions
80
encode.go
80
encode.go
|
@ -1,6 +1,38 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import ()
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
reverseHexTable = "" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
|
||||||
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ErrLength = errors.New("encoding/hex: odd length hex string")
|
||||||
|
|
||||||
|
// InvalidByteError values describe errors resulting from an invalid byte in a hex string.
|
||||||
|
type InvalidByteError byte
|
||||||
|
|
||||||
|
func (e InvalidByteError) Error() string {
|
||||||
|
return fmt.Sprintf("encoding/hex: invalid byte: %#U", rune(e))
|
||||||
|
}
|
||||||
|
|
||||||
func binaryEncode(dst, src []byte) {
|
func binaryEncode(dst, src []byte) {
|
||||||
d := uint(0)
|
d := uint(0)
|
||||||
|
@ -58,33 +90,33 @@ func hexEncode(dst, src []byte, hextable string) {
|
||||||
// returns -1 on bad byte or space (\t \s \n)
|
// returns -1 on bad byte or space (\t \s \n)
|
||||||
// returns -2 on two consecutive spaces
|
// returns -2 on two consecutive spaces
|
||||||
// returns 0 on success
|
// returns 0 on success
|
||||||
func hexDecode(dst, src []byte) int {
|
|
||||||
_, _ = src[2], dst[0]
|
|
||||||
|
|
||||||
if isSpace(src[0]) {
|
func hexDecode(dst, src []byte) (int, error) {
|
||||||
if isSpace(src[1]) {
|
i, j := 0, 1
|
||||||
return -2
|
for ; j < len(src); j += 2 {
|
||||||
|
p := src[j-1]
|
||||||
|
q := src[j]
|
||||||
|
|
||||||
|
a := reverseHexTable[p]
|
||||||
|
b := reverseHexTable[q]
|
||||||
|
if a > 0x0f {
|
||||||
|
return i, InvalidByteError(p)
|
||||||
}
|
}
|
||||||
return -1
|
if b > 0x0f {
|
||||||
}
|
return i, InvalidByteError(q)
|
||||||
|
|
||||||
if isPrefix(src[0:2]) {
|
|
||||||
src = src[2:]
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < len(src)/2; i++ {
|
|
||||||
a, ok := fromHexChar(src[i*2])
|
|
||||||
if !ok {
|
|
||||||
return -1
|
|
||||||
}
|
}
|
||||||
b, ok := fromHexChar(src[i*2+1])
|
dst[i] = (a << 4) | b
|
||||||
if !ok {
|
i++
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
dst[0] = (a << 4) | b
|
|
||||||
}
|
}
|
||||||
return 0
|
if len(src)%2 == 1 {
|
||||||
|
// Check for invalid char before reporting bad length,
|
||||||
|
// since the invalid char (if present) is an earlier problem.
|
||||||
|
if reverseHexTable[src[j-1]] > 0x0f {
|
||||||
|
return i, InvalidByteError(src[j-1])
|
||||||
|
}
|
||||||
|
return i, ErrLength
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// copied from encoding/hex package
|
// copied from encoding/hex package
|
||||||
|
|
|
@ -37,9 +37,11 @@ func XXDReverse(r io.Reader, w io.Writer) error {
|
||||||
octs = cols
|
octs = cols
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// character count
|
||||||
c := int64(0)
|
c := int64(0)
|
||||||
rd := bufio.NewReader(r)
|
rd := bufio.NewReader(r)
|
||||||
for {
|
for {
|
||||||
|
// TODO this is causing issues with plain
|
||||||
line, err := rd.ReadBytes('\n')
|
line, err := rd.ReadBytes('\n')
|
||||||
n := len(line)
|
n := len(line)
|
||||||
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, io.ErrUnexpectedEOF) {
|
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, io.ErrUnexpectedEOF) {
|
||||||
|
@ -52,7 +54,7 @@ func XXDReverse(r io.Reader, w io.Writer) error {
|
||||||
|
|
||||||
if dumpType == dumpHex {
|
if dumpType == dumpHex {
|
||||||
for i := 0; n >= octs; {
|
for i := 0; n >= octs; {
|
||||||
if rv := hexDecode(char, line[i:i+octs]); rv == 0 {
|
if rv, _ := hexDecode(char, line[i:i+octs]); rv == 0 {
|
||||||
w.Write(char)
|
w.Write(char)
|
||||||
i += 2
|
i += 2
|
||||||
n -= 2
|
n -= 2
|
||||||
|
@ -81,7 +83,7 @@ func XXDReverse(r io.Reader, w io.Writer) error {
|
||||||
}
|
}
|
||||||
} else if dumpType == dumpPlain {
|
} else if dumpType == dumpPlain {
|
||||||
for i := 0; n >= octs; i++ {
|
for i := 0; n >= octs; i++ {
|
||||||
if hexDecode(char, line[i:i+octs]) == 0 {
|
if rv, _ := hexDecode(char, line[i:i+octs]); rv != 0 {
|
||||||
w.Write(char)
|
w.Write(char)
|
||||||
c++
|
c++
|
||||||
}
|
}
|
||||||
|
@ -89,7 +91,7 @@ func XXDReverse(r io.Reader, w io.Writer) error {
|
||||||
}
|
}
|
||||||
} else if dumpType == dumpCformat {
|
} else if dumpType == dumpCformat {
|
||||||
for i := 0; n >= octs; {
|
for i := 0; n >= octs; {
|
||||||
if rv := hexDecode(char, line[i:i+octs]); rv == 0 {
|
if rv, _ := hexDecode(char, line[i:i+octs]); rv == 0 {
|
||||||
w.Write(char)
|
w.Write(char)
|
||||||
i += 4
|
i += 4
|
||||||
n -= 4
|
n -= 4
|
||||||
|
|
Loading…
Reference in a new issue