Stocker les octets littéraux4 sous forme de chaîne

thefett

Stocker les octets littéraux4 sous forme de chaîne


Quelqu’un at-il le «somefunc» ci-dessous pour stocker des octets (en particulier bytes4) sous forme de chaîne? Idéalement, quelque chose pour obtenir method_s dans le code ci-dessous:

 contract Test { bytes4 public  method ; 
   string   public  method_s ; 

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

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

 } 

J’ai donc besoin de method = 0x0cb9ef7a et method_s = « 0x0cb9ef7a »

Merci d’avance

Réponses


 Ismael

Ce code convertira un octet4 en une chaîne hexadécimale

 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 ); 
 } 

thefett

Fonctionne comme un charme. J’y travaillais en essayant d’utiliser l’assemblage, mais c’est un solide. Merci pour l’effort

Ismael

Il ne devrait pas être difficile d’écrire l’assembly directement, mais les chaînes courtes ont un encodage particulier qui peut être gênant, consultez cet article pour la désactivation du stockage de chaînes et de tableaux medium.com/@hayeah/… .

 

(sous, #de, chaîne, forme, Les, littéraux4, octets, stocker

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *