Almacenar bytes4 literales como cadena

¿Alguien tiene el 'somefunc' a continuación para almacenar bytes (específicamente bytes4) como una cadena? Idealmente, algo para obtener method_s en el siguiente código:

contract Test{
  bytes4 public method;
  string public method_s;

  function Test() {
    method = this.get_f.selector;
  }

  function makeString(){
   method_s = somefunc(method);
  }

}

Entonces necesito method = 0x0cb9ef7a y method_s = "0x0cb9ef7a"

Muchas gracias de antemano

Respuestas (2)

Este código convertirá un bytes4 en una cadena hexadecimal

function toHexDigit(uint8 d) pure internal returns (byte) {                                                                                      
    if (0 <= d && d <= 9) {                                                                                                                      
        return byte(uint8(byte('0')) + d);                                                                                                       
    } else if (10 <= uint8(d) && uint8(d) <= 15) {                                                                                               
        return byte(uint8(byte('a')) + d - 10);                                                                                                  
    }                                                                                                                                            
    revert();                                                                                                                                    
}                                                                                                                                                

function fromCode(bytes4 code) public view returns (string) {                                                                                    
    bytes memory result = new bytes(10);                                                                                                         
    result[0] = byte('0');
    result[1] = byte('x');
    for (uint i=0; i<4; ++i) {
        result[2*i+2] = toHexDigit(uint8(code[i])/16);
        result[2*i+3] = toHexDigit(uint8(code[i])%16);
    }
    return string(result);
}
Funciona de maravilla. Estaba trabajando en eso tratando de usar el ensamblaje, pero esto es sólido. Gracias por el esfuerzo
No debería ser difícil escribir el ensamblado directamente, pero las cadenas cortas tienen una codificación particular que puede ser molesta. Consulte este artículo para obtener información sobre el medio de almacenamiento de cadenas y arreglos. com/@hayeah/ … .

adoptado a 0.8+

  function toHexDigit(uint8 d) pure internal returns (bytes1) {
    if (0 <= d && d <= 9) {
      return bytes1(uint8(bytes1('0')) + d);
    } else if (10 <= uint8(d) && uint8(d) <= 15) {
      return bytes1(uint8(bytes1('a')) + d - 10);
    }
    revert();
  }

  function fromCode(bytes4 code) public pure returns (string memory) {
    bytes memory result = new bytes(10);
    result[0] = bytes1('0');
    result[1] = bytes1('x');
    for (uint i = 0; i < 4; ++i) {
      result[2 * i + 2] = toHexDigit(uint8(code[i]) / 16);
      result[2 * i + 3] = toHexDigit(uint8(code[i]) % 16);
    }
    return string(result);
  }