[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/aboutcode-org/commoncode/main/src/commoncode/codec.py [Back]  [Original]

#
# Copyright (c) nexB Inc. and others. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# See http://www.apache.org/licenses/LICENSE-2.0 for the license text.
# See https://github.com/aboutcode-org/commoncode for support or download.
# See https://aboutcode.org for more information about nexB OSS projects.
#

from base64 import standard_b64decode as stddecode
from base64 import urlsafe_b64encode as b64encode

"""
Numbers to bytes or strings and URLs coder/decoders.
"""


def c2i(c):
    return c


def i2c(i):
    return bytes([i])


def num_to_bin(num):
    """
    Convert a `num` integer or long to a binary string byte-ordered such that
    the least significant bytes are at the beginning of the string (aka. big
    endian).
    """
    # Zero is not encoded but returned as an empty value
    if num == 0:
        return b"\x00"

    return num.to_bytes((num.bit_length() + 7) // 8, "big")


def bin_to_num(binstr):
    """
    Convert a big endian byte-ordered binary string to an integer or long.
    """
    return int.from_bytes(binstr, byteorder="big", signed=False)


def urlsafe_b64encode(s):
    """
    Encode a binary string to a url safe base64 encoding.
    """
    return b64encode(s)


def urlsafe_b64decode(b64):
    """
    Decode a url safe base64-encoded string.
    Note that we use stddecode to work around a bug in the standard library.
    """
    b = b64.replace(b"-", b"+").replace(b"_", b"/")
    return stddecode(b)


def urlsafe_b64encode_int(num):
    """
    Encode a number (int or long) in url safe base64.
    """
    return b64encode(num_to_bin(num))

Web Proxy Viewer  |  New URL  |  Original Page