1
I want to convert a string to hexadecimal:
cadeia = "blablabla"
1
I want to convert a string to hexadecimal:
cadeia = "blablabla"
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)
Could link the doc of the functions, would value the answer.
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
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 prisma
You are not signed in. Login or sign up in order to post.
I don’t see how the question or the answer can be useful in the format they are now.
– user28595
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.
– Jéf Bueno