diff --git a/util/stringutils/stringutils.go b/util/stringutils/stringutils.go index 460c656..c38f70f 100644 --- a/util/stringutils/stringutils.go +++ b/util/stringutils/stringutils.go @@ -95,3 +95,22 @@ func ContainsWord(str, w string) bool { reg := regexp.MustCompile(fmt.Sprintf("\\b%s\\b", w)) return reg.MatchString(str) } + +func byte2hex(b byte) byte { + if b >= 0 && b <= 9 { + return b + 0x30 + } + if b >= 10 && b <= 15 { + return b - 10 + 0x61 + } + return '?' +} + +func Bytes2Str(b []byte) string { + buf := strings.Builder{} + for i := range b { + buf.WriteByte(byte2hex((b[i] & 0xf0) >> 4)) + buf.WriteByte(byte2hex(b[i] & 0x0f)) + } + return buf.String() +} diff --git a/util/stringutils/stringutils_test.go b/util/stringutils/stringutils_test.go index 6a985ec..f790712 100644 --- a/util/stringutils/stringutils_test.go +++ b/util/stringutils/stringutils_test.go @@ -163,3 +163,29 @@ func TestContainsWord(t *testing.T) { } } } + +func TestByte2Str(t *testing.T) { + cases := []struct { + in []byte + want string + }{ + { + in: []byte{0x00}, + want: "00", + }, + { + in: []byte{0x00, 0xff}, + want: "00ff", + }, + { + in: []byte{0xfe, 0x80, 0x00, 0x00}, + want: "fe800000", + }, + } + for _, c := range cases { + got := Bytes2Str(c.in) + if got != c.want { + t.Errorf("got %s want %s", got, c.want) + } + } +}