How to convert string to hexadecimal?

1

I want to convert a string into hexadecimal:

cadeia = "blablabla"
    
asked by anonymous 13.07.2017 / 20:28

2 answers

4

It can be done in two ways using the function format () :

cadeia = "blablabla"
hex = cadeia:formate("%X")

Or in this other way you can also achieve the same result:

cadeia = "blablabla"
hex = string.formate("%X", cadeia)
    
13.07.2017 / 20:40
1

The function string.formate is similar to C. sprintf (). In Prism, it formats a string with miscellaneous arguments and returns the formatted string; ex: s = string.formate ("time:% 02d:% 02d \ n", 6.30); now the value of s will be "time: 06: 30 \ n";

The character "% X" formats an integer in upper hexadecimal; putting a 0 and 2 between the% and X fills with zero the left (00, 01, 02 etc);

For more details give a ctrl + F in the page: basic manual

official language site

Below is the code I used to convert each byte of the string into hex, free to use, adapt to every need, or improve:

local string_em_hexa; //declarando uma variável local para a função;
local string_em_hexa_simples;

funcao principal(arg) //similar a função main do C ou Main do Java;
  local str = "blablabla";
  imprima( string_em_hexa(str) );
  //ou:
  imprima( string_em_hexa_simples(str));
  retorne 0; //retornando 0 para o sistema operacional;
fim

//Dois modos de fazer (duas funções):

//função não está limitada ao tamanho da pilha, mas é um pouco mais lenta;
funcao string_em_hexa(str)
  se tipo(str) <> 'string' entao 
    retorne falso, 'Erro, espera-se string em vez de ' .. tipo(arg); 
  fim
  local hexa =  '';
  local c;//declarando variável c como local; em Prisma variáveis não tem tipo fixo.
  para i=1,#str inicio  //o sinal # ao lado de uma string retorna seu comprimento;
    c = string.cod(str,i);//converte cada char (byte) para número
    hexa = hexa .. string.formate('%02X ',c); //formata o número para (%x) hexadecimal retornando em string;
  fim   
  retorne hexa;
fim 

//esta função é limitada pelo número máximo (999000) de indices do stack (pilha) de retorno; mas é mais rápida
//boa para strings não muito grandes (menores que 999000);
funcao string_em_hexa_simples(str)
  se tipo(str) <> 'string' entao 
    retorne falso, 'Erro, espera-se string em vez de ' .. tipo(arg); 
  senao
    retorne string.formate( string.nconcat('%02X ',#str), string.cod(str,1,#str)  );
  fim  
fim

//uma solução seria fazer uma função que usa blocos de 999000 bytes por vez, com isso
//teriamos rapidez e não estaria limitada ao tamanho da pilha;

Output:

62 6C 61 62 6C 61 62 6C 61

62 6C 61 62 6C 61 62 6C 61

PS: Another simpler and faster way:

local s = 'abcdefghijklmnopqrstuvwxyz';

funcao Hex(s)
  local strfmt = string.formate;
  local cod = cod;
  retorne (s:troque('[
local string_em_hexa; //declarando uma variável local para a função;
local string_em_hexa_simples;

funcao principal(arg) //similar a função main do C ou Main do Java;
  local str = "blablabla";
  imprima( string_em_hexa(str) );
  //ou:
  imprima( string_em_hexa_simples(str));
  retorne 0; //retornando 0 para o sistema operacional;
fim

//Dois modos de fazer (duas funções):

//função não está limitada ao tamanho da pilha, mas é um pouco mais lenta;
funcao string_em_hexa(str)
  se tipo(str) <> 'string' entao 
    retorne falso, 'Erro, espera-se string em vez de ' .. tipo(arg); 
  fim
  local hexa =  '';
  local c;//declarando variável c como local; em Prisma variáveis não tem tipo fixo.
  para i=1,#str inicio  //o sinal # ao lado de uma string retorna seu comprimento;
    c = string.cod(str,i);//converte cada char (byte) para número
    hexa = hexa .. string.formate('%02X ',c); //formata o número para (%x) hexadecimal retornando em string;
  fim   
  retorne hexa;
fim 

//esta função é limitada pelo número máximo (999000) de indices do stack (pilha) de retorno; mas é mais rápida
//boa para strings não muito grandes (menores que 999000);
funcao string_em_hexa_simples(str)
  se tipo(str) <> 'string' entao 
    retorne falso, 'Erro, espera-se string em vez de ' .. tipo(arg); 
  senao
    retorne string.formate( string.nconcat('%02X ',#str), string.cod(str,1,#str)  );
  fim  
fim

//uma solução seria fazer uma função que usa blocos de 999000 bytes por vez, com isso
//teriamos rapidez e não estaria limitada ao tamanho da pilha;
0-5]', funcao (c) retorne strfmt('%X ',cod(c)); fim)) fim imprima(Hex(s));
    
22.10.2017 / 02:59