How to convert a string to hexadecimal?

Asked

Viewed 151 times

1

I want to convert a string to hexadecimal:

cadeia = "blablabla"
  • 2

    I don’t see how the question or the answer can be useful in the format they are now.

  • 1

    Your intention is legal. Quality content pro site is always a good idea. But be careful with the frequency/amount of publications. Try to keep in mind the usefulness (beyond the quality itself, of course) of your questions/answers to site visitors.

2 answers

4


Can be done in two ways using the function formate():

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

Or else it is also possible to achieve the same result:

cadeia = "blablabla"
hex = string.formate("%X", cadeia)
  • 3

    Could link the doc of the functions, would value the answer.

  • 2

    And explain what this function does (if you do anything else), what are these characters %X ai. The answer is very vague, you understand, but you have to assume that whoever is reading may not understand the language ;)

1

The function string.formate is similar to sprintf() of C. In Prisma, it formats a string with various 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 "%X" character formats an integer in uppercase hexadecimal; by placing 0 and 2 between % and X fills with zero left (00, 01, 02 etc);

For more details give a Ctrl + F on the page: basic manual

official language website

Below follows the code I made to convert each byte of the string into hexa, free to use, adapt to each 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;

Exit:

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

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

PS.: Another way simpler and faster:

local s = 'abcdefghijklmnopqrstuvwxyz';

funcao Hex(s)
  local strfmt = string.formate;
  local cod = cod;
  retorne (s:troque('[\000-\255]', funcao (c) 
                             retorne strfmt('%X ',cod(c)); 
                          fim))
fim 

imprima(Hex(s));

Browser other questions tagged

You are not signed in. Login or sign up in order to post.