diff --git a/internal/str/str.go b/internal/str/str.go index 34d97d3d..84b4c21f 100644 --- a/internal/str/str.go +++ b/internal/str/str.go @@ -14,6 +14,26 @@ func Itod[T Int](n T) string { return strconv.FormatInt(int64(n), 10) } +// UToHex returns n formatted in hexidecimal. +func UToHex[T Uint](n T) string { + return strconv.FormatUint(uint64(n), 16) +} + +// ZeroPad pads value to the left with zeros, making the resulting string +// count bytes long. +func ZeroPad(count int, value string) string { + pad := count - len(value) + if pad < 0 { + panic("ZeroPad: count is less than len(value)") + } + buf := make([]byte, count) + for i := 0; i < pad; i++ { + buf[i] = '0' + } + copy(buf[:pad], value[:]) + return string(buf) +} + type Uint interface { ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uint } diff --git a/rawpointer.go b/rawpointer.go index bd74e784..2a5aeb61 100644 --- a/rawpointer.go +++ b/rawpointer.go @@ -1,8 +1,6 @@ package capnp import ( - "fmt" - "capnproto.org/go/capnp/v3/internal/str" ) @@ -250,7 +248,7 @@ func (p rawPointer) GoString() string { default: // other pointer if p.otherPointerType() != 0 { - return fmt.Sprintf("rawPointer(%#016x)", uint64(p)) + return "rawPointer(" + str.ZeroPad(16, str.UToHex(p)) + ")" } return "rawInterfacePointer(" + str.Utod(p.capabilityIndex()) + ")" }