Submission 758576a3...

ChallengeHex decoder
Submittersggc.yuetloo.eth
Submitted at2018-02-30
Gas used1560722
/**
 * This contract was a modified version of the original from 
 * https://github.com/arachnid/sggc.git
 *
 * This file is part of the 1st Solidity Gas Golfing Contest.
 *
 * This work is licensed under Creative Commons Attribution ShareAlike 3.0.
 * https://creativecommons.org/licenses/by-sa/3.0/
 */

pragma solidity 0.4.24;

contract HexDecoder {

    /**
     * @dev Decodes a hex-encoded input string, returning it in binary.
     *
     * Input strings may be of any length, but will always be a multiple of two
     * bytes long, and will not contain any non-hexadecimal characters.
     *
     * @param input The hex-encoded input.
     * @return The decoded output.
     */

    function decode(string input) public pure returns(bytes output) {
        assert(bytes(input).length % 2 == 0);

        if( bytes(input).length == 0 ) return;

        output = new bytes(bytes(input).length / 2);

        for(uint i = 0; i < output.length; i++) {
           uint b1 = uint(bytes(input)[i*2]);
           uint b2 = uint(bytes(input)[i*2+1]);
           uint n1 = (b1 <= 0x39? (b1 & 0x0f) : (b1 & 0xf) + 9);
           uint n2 = (b2 <= 0x39? (b2 & 0x0f) : (b2 & 0xf) + 9);
           output[i] = byte((n1 << 4) | n2);
        }
    }
}