체인의정석

Solidity 내부에서의 string과 bytes의 형변환 시 나는 오류 본문

블록체인/Solidity

Solidity 내부에서의 string과 bytes의 형변환 시 나는 오류

체인의정석 2024. 8. 23. 14:10
728x90
반응형

요청에 따라 컨트렉트를 작성하고 있었는데, 컨트렉트 내부에서 byte타입을 string으로 변환하려면 바로 형변환이 안되고 오류가 났었다.
string만 받는 기본 ERC721의 tokenURI에 bytes를 넣고 함수내부적으로도 가져와서 사용해야 하는 상황이다.

이런 경우에는 형변환을 추가적으로 해주어야 하는데 아래 함수를 쓰면 된다. 이건 stack overflow에서 가져왔다.

https://ethereum.stackexchange.com/questions/126899/convert-bytes-to-hexadecimal-string-in-solidity

 

Convert bytes to hexadecimal string in solidity

In a smart contract I have stored a bytes4 value: 0xa22cb465. I'd like to parse this value as a string: string memory test = "0xa22cb465" I've only stumbled upon explanations on how to co...

ethereum.stackexchange.com

 

    function iToHex(bytes memory buffer) internal pure returns (string memory) {
        // Fixed buffer size for hexadecimal convertion
        bytes memory converted = new bytes(buffer.length * 2);

        bytes memory _base = "0123456789abcdef";

        for (uint256 i = 0; i < buffer.length; i++) {
            converted[i * 2] = _base[uint8(buffer[i]) / _base.length];
            converted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];
        }

        return string(abi.encodePacked("0x", converted));
    }

반면 반대로 bytes를 string으로 하는것도 요구사항에 필요해서 이건 따로 매핑을 내부적으로 만들어서 해결했다.

정석은 원래 오프체인에서 인풋값으로 bytes형태를 넣어주는게 맞지만 때에 따라선 이런것을 특정 표준이나 기존 코드에 맞추어서 내부적으로 해주어야 하기에 이런 방법을 쓸 수 있다.



728x90
반응형
Comments