hex byte: raise instead of assert on hex-to-byte odd lengths
This commit is contained in:
parent
3e1fa974a4
commit
87ccf8e66b
|
@ -51,7 +51,7 @@ proc readHexChar*(c: char): byte {.noSideEffect, inline.}=
|
||||||
template skip0xPrefix(hexStr: string): int =
|
template skip0xPrefix(hexStr: string): int =
|
||||||
## Returns the index of the first meaningful char in `hexStr` by skipping
|
## Returns the index of the first meaningful char in `hexStr` by skipping
|
||||||
## "0x" prefix
|
## "0x" prefix
|
||||||
if hexStr[0] == '0' and hexStr[1] in {'x', 'X'}: 2
|
if hexStr.len > 1 and hexStr[0] == '0' and hexStr[1] in {'x', 'X'}: 2
|
||||||
else: 0
|
else: 0
|
||||||
|
|
||||||
func hexToByteArray*(hexStr: string, output: var openArray[byte], fromIdx, toIdx: int) =
|
func hexToByteArray*(hexStr: string, output: var openArray[byte], fromIdx, toIdx: int) =
|
||||||
|
@ -62,8 +62,8 @@ func hexToByteArray*(hexStr: string, output: var openArray[byte], fromIdx, toIdx
|
||||||
doAssert(fromIdx >= 0 and toIdx >= fromIdx and fromIdx < output.len and toIdx < output.len)
|
doAssert(fromIdx >= 0 and toIdx >= fromIdx and fromIdx < output.len and toIdx < output.len)
|
||||||
let sz = toIdx - fromIdx + 1
|
let sz = toIdx - fromIdx + 1
|
||||||
|
|
||||||
doAssert hexStr.len - sIdx >= 2*sz
|
if hexStr.len - sIdx < 2*sz:
|
||||||
|
raise (ref ValueError)(msg: "hex string too short")
|
||||||
sIdx += fromIdx * 2
|
sIdx += fromIdx * 2
|
||||||
for bIdx in fromIdx ..< sz + fromIdx:
|
for bIdx in fromIdx ..< sz + fromIdx:
|
||||||
output[bIdx] = hexStr[sIdx].readHexChar shl 4 or hexStr[sIdx + 1].readHexChar
|
output[bIdx] = hexStr[sIdx].readHexChar shl 4 or hexStr[sIdx + 1].readHexChar
|
||||||
|
@ -89,7 +89,9 @@ func hexToPaddedByteArray*[N: static[int]](hexStr: string): array[N, byte] =
|
||||||
bIdx: int
|
bIdx: int
|
||||||
shift = 4
|
shift = 4
|
||||||
|
|
||||||
doAssert hexStr.len - p <= maxStrSize
|
if hexStr.len - p > maxStrSize:
|
||||||
|
# TODO this is a bit strange, compared to the hexToByteArray above...
|
||||||
|
raise (ref ValueError)(msg: "hex string too long")
|
||||||
|
|
||||||
if sz < maxStrSize:
|
if sz < maxStrSize:
|
||||||
# include extra byte if odd length
|
# include extra byte if odd length
|
||||||
|
@ -105,7 +107,8 @@ func hexToPaddedByteArray*[N: static[int]](hexStr: string): array[N, byte] =
|
||||||
|
|
||||||
func hexToSeqByte*(hexStr: string): seq[byte] =
|
func hexToSeqByte*(hexStr: string): seq[byte] =
|
||||||
## Read an hex string and store it in a sequence of bytes. No "endianness" reordering is done.
|
## Read an hex string and store it in a sequence of bytes. No "endianness" reordering is done.
|
||||||
doAssert (hexStr.len and 1) == 0
|
if (hexStr.len and 1) == 1:
|
||||||
|
raise (ref ValueError)(msg: "hex string must have even length")
|
||||||
|
|
||||||
let skip = skip0xPrefix(hexStr)
|
let skip = skip0xPrefix(hexStr)
|
||||||
let N = (hexStr.len - skip) div 2
|
let N = (hexStr.len - skip) div 2
|
||||||
|
|
|
@ -33,8 +33,17 @@ suite "Byte utils":
|
||||||
a = hexToByteArray[4](s)
|
a = hexToByteArray[4](s)
|
||||||
check a == simpleBArray
|
check a == simpleBArray
|
||||||
|
|
||||||
|
expect(ValueError): discard hexToByteArray[1]("")
|
||||||
|
expect(ValueError): discard hexToByteArray[1]("1")
|
||||||
|
|
||||||
test "toHex":
|
test "toHex":
|
||||||
check simpleBArray.toHex == "12345678"
|
check simpleBArray.toHex == "12345678"
|
||||||
|
check hexToSeqByte("12345678") == simpleBArray
|
||||||
|
check hexToSeqByte("00") == [byte 0]
|
||||||
|
check hexToSeqByte("0x") == []
|
||||||
|
expect(ValueError): discard hexToSeqByte("1234567")
|
||||||
|
expect(ValueError): discard hexToSeqByte("X")
|
||||||
|
expect(ValueError): discard hexToSeqByte("0")
|
||||||
|
|
||||||
test "Array concatenation":
|
test "Array concatenation":
|
||||||
check simpleBArray & simpleBArray ==
|
check simpleBArray & simpleBArray ==
|
||||||
|
@ -57,7 +66,7 @@ suite "Byte utils":
|
||||||
let a = hexToPaddedByteArray[32]("0x68656c6c6f20776f726c64")
|
let a = hexToPaddedByteArray[32]("0x68656c6c6f20776f726c64")
|
||||||
check a.toHex == "00000000000000000000000000000000000000000068656c6c6f20776f726c64"
|
check a.toHex == "00000000000000000000000000000000000000000068656c6c6f20776f726c64"
|
||||||
block:
|
block:
|
||||||
expect AssertionError:
|
expect ValueError:
|
||||||
discard hexToPaddedByteArray[2]("0x12345")
|
discard hexToPaddedByteArray[2]("0x12345")
|
||||||
|
|
||||||
test "lessThan":
|
test "lessThan":
|
||||||
|
|
Loading…
Reference in New Issue