{"record":{"id":"37df021e9ae5000a","repo":"tailscale/tailscale","slug":"s-invalid-hex-character-c","errorCode":null,"errorMessage":"%s: invalid hex character: %c","messagePattern":"(.+?): invalid hex character: %c","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"types/logid/id.go","lineNumber":138,"sourceCode":"}\n\nfunc (id PublicID) IsZero() bool {\n\treturn id == PublicID{}\n}\n\nfunc (id PublicID) Prefix64() uint64 {\n\treturn binary.BigEndian.Uint64(id[:8])\n}\n\nfunc parseID[Bytes []byte | string](funcName string, out *[32]byte, in Bytes) (err error) {\n\tif len(in) != 2*len(out) {\n\t\treturn fmt.Errorf(\"%s: invalid hex length: %d\", funcName, len(in))\n\t}\n\tvar hexArr [2 * len(out)]byte\n\tcopy(hexArr[:], in)\n\tif _, err := hex.Decode(out[:], hexArr[:]); err != nil {\n\t\tr, _ := utf8.DecodeRune(bytes.TrimLeft([]byte(in), \"0123456789abcdefABCDEF\"))\n\t\treturn fmt.Errorf(\"%s: invalid hex character: %c\", funcName, r)\n\t}\n\treturn nil\n}\n\nfunc add(id [32]byte, i int64) [32]byte {\n\tvar out uint64\n\tswitch {\n\tcase i < 0:\n\t\tborrow := ^uint64(i) + 1 // twos-complement inversion\n\t\tfor i := 0; i < 4 && borrow > 0; i++ {\n\t\t\tout, borrow = bits.Sub64(binary.BigEndian.Uint64(id[8*(3-i):]), borrow, 0)\n\t\t\tbinary.BigEndian.PutUint64(id[8*(3-i):], out)\n\t\t}\n\tcase i > 0:\n\t\tcarry := uint64(i)\n\t\tfor i := 0; i < 4 && carry > 0; i++ {\n\t\t\tout, carry = bits.Add64(binary.BigEndian.Uint64(id[8*(3-i):]), carry, 0)\n\t\t\tbinary.BigEndian.PutUint64(id[8*(3-i):], out)","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/types/logid/id.go#L120-L156","documentation":"parseID reports the first non-hex character (%c, found by trimming valid hex digits from the left) after encoding/hex.Decode fails. Length was correct but the string contains a character outside 0-9a-fA-F — typically a typo, '0x' prefix, or copy/paste artifact.","triggerScenarios":"Thrown at types/logid/id.go:138 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Correct or regenerate the log ID string so it is pure lowercase/uppercase hex","Strip any '0x' prefix or separators before parsing","Treat the failing character reported in the message as the location of the typo when fixing source data"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}