Skip to content

Instantly share code, notes, and snippets.

@nosahama
Forked from ryancharris/Base64.sol
Created May 31, 2022 22:57
Show Gist options
  • Save nosahama/abc4ecbcab0b5e558f967d38e5d62986 to your computer and use it in GitHub Desktop.
Save nosahama/abc4ecbcab0b5e558f967d38e5d62986 to your computer and use it in GitHub Desktop.

Revisions

  1. @ryancharris ryancharris revised this gist Jan 23, 2022. No changes.
  2. @ryancharris ryancharris created this gist Jan 23, 2022.
    73 changes: 73 additions & 0 deletions Base64.sol
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    pragma solidity >=0.8.0 <0.9.0;

    // SPDX-License-Identifier: MIT
    /// [MIT License]
    /// @title Base64
    /// @notice Provides a function for encoding some bytes in base64
    /// @author Brecht Devos <[email protected]>
    library Base64 {
    bytes internal constant TABLE =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
    uint256 len = data.length;
    if (len == 0) return "";

    // multiply by 4/3 rounded up
    uint256 encodedLen = 4 * ((len + 2) / 3);

    // Add some extra buffer at the end
    bytes memory result = new bytes(encodedLen + 32);

    bytes memory table = TABLE;

    assembly {
    let tablePtr := add(table, 1)
    let resultPtr := add(result, 32)

    for {
    let i := 0
    } lt(i, len) {

    } {
    i := add(i, 3)
    let input := and(mload(add(data, i)), 0xffffff)

    let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
    out := shl(8, out)
    out := add(
    out,
    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
    )
    out := shl(8, out)
    out := add(
    out,
    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
    )
    out := shl(8, out)
    out := add(
    out,
    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
    )
    out := shl(224, out)

    mstore(resultPtr, out)

    resultPtr := add(resultPtr, 4)
    }

    switch mod(len, 3)
    case 1 {
    mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
    }
    case 2 {
    mstore(sub(resultPtr, 1), shl(248, 0x3d))
    }

    mstore(result, encodedLen)
    }

    return string(result);
    }
    }