93 lines
2.6 KiB
Nim
93 lines
2.6 KiB
Nim
# Copyright 2022 Mattia Giambirtone & All Contributors
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
## Utilities to handle multibyte sequences
|
|
import nimSHA2
|
|
|
|
|
|
proc toDouble*(input: int | uint | uint16): array[2, uint8] =
|
|
## Converts an unsigned integer
|
|
## to an array[2, uint8]
|
|
result = cast[array[2, uint8]](uint16(input))
|
|
|
|
|
|
proc toTriple*(input: uint | int): array[3, uint8] =
|
|
## Converts an unsigned integer to an array[3, uint8]
|
|
result = cast[array[3, uint8]](uint(input))
|
|
|
|
|
|
proc toQuad*(input: int | uint | uint16 | uint32): array[4, uint8] =
|
|
## Converts an unsigned integer to an array[4, uint8]
|
|
result = cast[array[4, uint8]](uint(input))
|
|
|
|
|
|
proc toLong*(input: int | uint | uint16 | uint32 | uint64): array[8, uint8] =
|
|
## Converts an unsigned integer to an array[8, uint8]
|
|
result = cast[array[8, uint8]](uint(input))
|
|
|
|
|
|
proc fromDouble*(input: array[2, uint8]): uint16 =
|
|
## Rebuilds the output of toDouble into
|
|
## an uint16
|
|
copyMem(result.addr, unsafeAddr(input), sizeof(uint16))
|
|
|
|
|
|
proc fromTriple*(input: array[3, uint8]): uint =
|
|
## Rebuilds the output of toTriple into
|
|
## an uint
|
|
copyMem(result.addr, unsafeAddr(input), sizeof(uint8) * 3)
|
|
|
|
|
|
proc fromQuad*(input: array[4, uint8]): uint =
|
|
## Rebuilts the output of toQuad into
|
|
## an uint
|
|
copyMem(result.addr, unsafeAddr(input), sizeof(uint32))
|
|
|
|
|
|
proc fromLong*(input: array[8, uint8]): uint =
|
|
## Rebuilts the output of toQuad into
|
|
## an uint
|
|
copyMem(result.addr, unsafeAddr(input), sizeof(uint64))
|
|
|
|
|
|
proc toBytes*(s: string): seq[byte] =
|
|
## Converts a string into a sequence
|
|
## of bytes
|
|
for c in s:
|
|
result.add(byte(c))
|
|
|
|
|
|
proc toBytes*(s: int): array[8, uint8] =
|
|
## Converts
|
|
result = cast[array[8, uint8]](s)
|
|
|
|
|
|
proc toBytes*(d: SHA256Digest): seq[byte] =
|
|
## Converts a SHA256 hash digest to
|
|
## a sequence of bytes
|
|
for b in d:
|
|
result.add(b)
|
|
|
|
|
|
proc fromBytes*(input: seq[byte]): string =
|
|
## Converts a sequence of bytes to
|
|
## a string
|
|
for b in input:
|
|
result.add(char(b))
|
|
|
|
|
|
proc extend*[T](s: var seq[T], a: openarray[T]) =
|
|
## Extends s with the elements of a
|
|
for e in a:
|
|
s.add(e) |