oribeiro Posted March 19, 2019 Report Share Posted March 19, 2019 Pessoal, Alguém, por favor, consegue converter essa função C para uso no xHarbour? private static string ToBase64Hex(string value) { int countChars = value.Length; byte[] bytes = new byte[countChars / 2]; for(int i = 0; i < countChars; i+=2) { bytes[i / 2] = Convert.ToByte(value.Substring(i, 2), 16); } return Convert.ToBase64String(bytes); } Quote Link to comment Share on other sites More sharing options...
msdn Posted March 19, 2019 Report Share Posted March 19, 2019 Eu utilizo assim : #pragma BEGINDUMP #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #include <windows.h> #include "hbapi.h" HB_FUNC (GETDESKTOPREALTOP) { RECT rect; SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 ); hb_retni(rect.top); } HB_FUNC (GETDESKTOPREALLEFT) { RECT rect; SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 ); hb_retni(rect.left); } HB_FUNC (GETDESKTOPREALWIDTH) { RECT rect; SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 ); hb_retni(rect.right - rect.left); } HB_FUNC (GETDESKTOPREALHEIGHT) { RECT rect; SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 ); hb_retni(rect.bottom - rect.top); } #pragma ENDDUMP Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 19, 2019 Report Share Posted March 19, 2019 Oscar, você não se refere a isto? http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=13915 https://searchcode.com/codesearch/view/4503871/ Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 22, 2019 Author Report Share Posted March 22, 2019 Bom dia João, Obrigado pelo seu interesse em ajudar. Deixa eu explicar o meu objetivo com esse algorítmo em C# : Estou planejando as mudanças que virão na NF-e com a inclusão dos dados do desenvolvedor. A primeira parte da conversão eu consegui com o comando: hb_sha1( codigo_exemplo ) que funciona perfeitamente e me retorna a chave "696bfa2de10ce17eaee3ea8123639867c82b8a0c" depois disso eu preciso converter essa chave para Base64 mas o problema é que o comando HB_Base64encode( "696bfa2de10ce17eaee3ea8123639867c82b8a0c" ) retorna "Njk2YmZhMmRlMTBjZTE3ZWFlZTNlYTgxMjM2Mzk4NjdjODJiOGEwYw==" e eu preciso que retorne "aWv6LeEM4X6u4+qBI2OYZ8grigw=". Achei num fórum esse algoritmo em C# que pega o resultado do HB_Base64encode() e gera o código que eu preciso, mas não estou conseguindo fazer essa rotina em xHarbour. Você conhece alguma função que faça isso? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 22, 2019 Author Report Share Posted March 22, 2019 Estou tentando fazer isso: Passos necessários para geração do "hashCSRT" : 1) Concatenar o CSRT com a chave de acesso da NF-e/NFC-e que está sendo emitida. CSRT: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO Chave de Acesso: 41180678393592000146558900000006041028190697 Concatenada: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697 2) Aplicar o algoritmo SHA-1 sobre o resultado da concatenação do passo 1, resultando em um string de 20 bytes hexadecimais. Resultado: 696bfa2de10ce17eaee3ea8123639867c82b8a0c 3) Converter o resultado do passo anterior para Base64, resultando em uma string de 28 caracteres; Resultado: aWv6LeEM4X6u4+qBI2OYZ8grigw= 4) Montar o grupo de identificação da empresa desenvolvedora do software (tag: infRespTec), com a tag "idCSRT" o identificador do CSRT utilizado para a geração do hash e a tag "hashCSRT" o resultado do passo 3. Resultado: Fonte: NT2018_005_v1_20 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 22, 2019 Report Share Posted March 22, 2019 Estranho, aqui também retorna a mesma coisa: https://www.base64encode.org/ Retorna: Njk2YmZhMmRlMTBjZTE3ZWFlZTNlYTgxMjM2Mzk4NjdjODJiOGEwYw== Quote Link to comment Share on other sites More sharing options...
Valdir Posted March 22, 2019 Report Share Posted March 22, 2019 É neste cálculo que também estou com problemas... Se alguém manja de Programação em "C" puder ajudar, agradecemos. Abraços. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 22, 2019 Report Share Posted March 22, 2019 Oscar, não chego no teu resultado, reveja sua função. #include "FiveWin.ch" FUNCTION Main() LOCAL CSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO" LOCAL cChave := "41180678393592000146558900000006041028190697" LOCAL cConca := SPACE(80) LOCAL cConca2 := SPACE(28) LOCAL cConca3 := SPACE(28) //Concatenada: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697 cConca := CSRT + cChave ? cConca //-> G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697 cConca2 := HB_SHA1( cConca ) ? cConca2 cConca3 := HB_Base64Encode( cConca2, Len( cConca2 ) ) ? cConca3 ? HB_Base64Decode( cConca3 ) // correto o inverso. RETURN NIL Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 22, 2019 Author Report Share Posted March 22, 2019 João, Esses valores do exemplo que passei dão certo no SEFAZ. Só não sei como calcular o hash de 28 posições que é calculado por aquele programa em C#. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 22, 2019 Report Share Posted March 22, 2019 Oscar, não seria com o comando: HASH() ?? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 22, 2019 Report Share Posted March 22, 2019 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 22, 2019 Author Report Share Posted March 22, 2019 João, Li todas as suas referências mas tá difícil! Risos Ainda não cheguei no Hash de 28 caracteres que o SEFAZ exige. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 22, 2019 Report Share Posted March 22, 2019 Faltou alguma coisa aqui na função do Toya, ou estou engando? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 22, 2019 Author Report Share Posted March 22, 2019 Esta incompleto. A chave está na função em C# que postei no início desse tópico. Se alguém que entende de C# puder criar uma função igual no xHarbour o problema estará resolvido. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 25, 2019 Report Share Posted March 25, 2019 Oscar mira aqui: http://www.pctoledo.com.br/forum/viewtopic.php?f=4&p=129565#p129565 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 25, 2019 Author Report Share Posted March 25, 2019 Eita João, Você me ajudou muito! Só faltava colocar .T. como segundo parâmetro do hb_sha1(). // CRIAR HashCSRT // wCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO" wChave := "41180678393592000146558900000006041028190697" codigo := wCSRT + wChave codigo1 := hb_sha1(codigo, .T.) codigo2 := HB_Base64encode(codigo1, Len(codigo1)) Msginfo( codigo1+chr(13)+chr(13)+"Modelo: aWv6LeEM4X6u4+qBI2OYZ8grigw="+chr(13)+chr(13)+"Gerado: "+codigo2, "HB_base64encode() -> Tamanho: "+str(len(codigo2)) ) Muito obrigado, mais uma vez. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.