FUNÇÃO BITRSHIFT()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:-O
- Bom dia, amigos alguém saberia como traduzir os comandos abaixo para Harbour:

iLow := BITRSHIFT( iTamanho, 8 )
iHigh := BITAND( iTamanho, 255) + 2

Explico: Na geração do QRCode do extrato SAT estou fazendo alguma coisa errada:

iTamanho := Len( x_URL_QrCode ) + 3
iLow := MOD( iTamanho, 256 )
iHigh := iTamanho / 256 && Em Harbour/Clipper não temos DIV() por isso fiz assim ok

O QrCode é rejeitado pelo aplicativo de olho na nota, fiz o teste imprimindo um cupom no meu sistema com esse calculo, depois imprimi via acbr o mesmo xml e do Acbr passa certinho ou seja está errado algo na geração do QrCode e não no arquivo XML ou algo assim, revendo meus exemplos encontrei a base de onde montei minha geração do código que está em VB ou VFP mas... com certeza não traduzi corretamente as primeiras linhas BirtShift() e Bitand().

:'(

HASA
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

Chute:

Código: Selecionar todos

iLow := Mod( nTamanho, 255 )
iHigh := Int( nTamanho / 255 ) + 2
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:? :'(

José o QRCode nem imprimiu.
:-O
HASA
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

No original tem um +2 na segunda parte.
Não vi isso na sua rotina.
E também a segunda parte acredito que deva ser inteira, sem decimais.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:-o

José, achei esse código que traduzindo talvez seja o correto:

Código: Selecionar todos

Procedure ImprimirQrCode();
var
  Arq : TextFile;
  cCaracter, Linha : AnsiString;
  I, iTam1, iTam2 : integer;
begin
  AssignFile(Arq, 'COM1');
  Rewrite(Arq);
  Writeln(Arq, #27'@'#29#249#32#48);

  for J := 1 to length(Linha) do
    cCaracter := cCaracter + AnsiChar(chr(Ord(Linha[J])));

  if (length(Linha) > 255) then
  begin
    iTam1 := length(Linha) mod 255;
    iTam2 := length(Linha) div 255;
  end
  else
  begin
    iTam1 := length(Linha);
    iTam2 := 0;
  end;
  Writeln(Arq, #27+ #97 +#49 + #1 + #29 + #107 + #81 + #0 + #0 + #4 + #2 + AnsiChar(chr(iTam1)) + AnsiChar(chr(iTam2)) + cCaracter);
  CloseFile(Arq);
end;
O que acha, está em Delphi para impressora Bematech ?

HASA
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

Não sei se ajuda:

hbwin.ch

Código: Selecionar todos

#define WIN_LOWORD( dw )                   hb_bitAnd( dw, 0xFFFF )
#define WIN_HIWORD( dw )                   hb_bitAnd( hb_bitShift( dw, -16 ), 0xFFFF )

Código: Selecionar todos

hbmk2 -find hb_bit
xhb.hbc (installed):
   hb_bitIsSet()
   xhb_bitAnd()
   xhb_bitOr()
   xhb_bitXor()
Harbour core (installed):
   hb_bitAnd()
   hb_bitNot()
   hb_bitOr()
   hb_bitReset()
   hb_bitSet()
   hb_bitShift()
   hb_bitTest()
   hb_bitXor()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

Confunde a primeira postagem, o RShift, e aquele +2 no segundo cálculo, que nessa última rotina que postou não tem.

A impressão que tenho é que o número é traduzido pra dois bytes, igual acontece com algumas APIs do Windows.
Acho que esses da hbwin devem resolver.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:D
Legal, vou testar, o outro exemplo em Delphi também vou tentar traduzir ok.
T+

HASA
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

Olhando a segunda rotina em Delphi:

iTam1 é o resto da divisão por 255
iTam2 é o inteiro da divisão por 255

Se o número for até 255, nem faz conta, coloca zero no iTam2, e já considera o número pra iTam1.

No final é o cálculo que coloquei, talvez só a ordem esteja invertida (e não tem o +2)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

FUNÇÃO BITRSHIFT()

Mensagem por JoséQuintas »

Me chamou a atenção esta parte:

AnsiChar(chr(iTam1))

Não sei se a codepage pode interferir no resultado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:(
José tentei compilar com Harbour 3.2 mas... não reconheceu a Hb_BITRSHIFT().
HASA
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por Kapiaba »

Hasa, veja se em FoxPró, é mais fácil para converter:

Código: Selecionar todos



DECLARE INTEGER Accdd1 IN "Aas973.dll" STRING @St
DECLARE INTEGER Fddig1 IN "Aas973.dll" INTEGER D

#DEFINE AccM1 0x313628FA
#DEFINE AccM2 0x7F03F6E4
#DEFINE AccM3 0x6589E678
#DEFINE AccM4 0x1654265F
#DEFINE AccM5 0x066E3FE0
#DEFINE AccM6 0x7C1B0162
#DEFINE AccM7 0x7C5612EE
#DEFINE AccM8 0x62EDDCAD
#DEFINE AccM9 0x69DF0765

DO CallMf

PROCEDURE CallMf
    DIMENSION AccA(100)
    LOCAL AccR1, AccR2, AccR3, AccR4, AccNa, AccUr, AccTem, K, I
    LOCAL St, Stt
    LOCAL LicIn, LicType, TokenId1, TokenId2
    LOCAL OrigDrive, DriveChar

    OrigDrive = .F.
    FOR I = 1 TO 100 
        AccA(I) = INT(RAND() * 0x7FFFFFFF)
    ENDFOR
    AccUr = 0
    FOR I = 1 TO 99 
        K = BITXOR(AccA(1 + I), BITAND(0xFF, AccUr)) % 99
        AccUr = BITXOR(AccA(1 + K), BITRSHIFT(AccUr, 8))
    ENDFOR
    AccUr = BITAND(0xFFFF, BITXOR(AccM6, AccUr))

    K = Fddig1(0)

    IF (K < 7)
        ?"No Key drive in the USB port"
    ELSE

    St = ""
    FOR I = 1 TO 100
        St = St + CHR(BITAND(AccA(I), 0xFF)) +;
        CHR(BITAND(BITRSHIFT(AccA(I),  8), 0xFF)) +;
        CHR(BITAND(BITRSHIFT(AccA(I), 16), 0xFF)) +;
        CHR(BITAND(BITRSHIFT(AccA(I), 24), 0xFF))
    ENDFOR

    = Accdd1(@St)
    
    FOR I = 1 TO 100
        Stt = SUBSTR(St, 4*I - 3, 4)
        AccA(I) = ASC(SUBSTR(Stt, 1, 1)) +; 
        BITLSHIFT(ASC(SUBSTR(Stt, 2, 1)),  8) +; 
        BITLSHIFT(ASC(SUBSTR(Stt, 3, 1)), 16) +; 
        BITLSHIFT(ASC(SUBSTR(Stt, 4, 1)), 24)
    ENDFOR

    AccNa = BITAND(BITXOR(AccA(100), AccM5), 1061109567)
    AccR1 = BITXOR(AccM1, AccA(1 + BITAND(AccNa, 0xFF)))
    AccR2 = BITXOR(AccM2, AccA(1 + BITAND(0xFF, BITRSHIFT(AccNa,  8))))
    AccR3 = BITXOR(AccM3, AccA(1 + BITAND(0xFF, BITRSHIFT(AccNa, 16))))
    AccR4 = BITXOR(AccM4, AccA(1 + BITAND(0xFF, BITRSHIFT(AccNa, 24))))
    AccTem = BITXOR((AccR2 - INT(BITNOT(AccR1) / AccUr)), AccR3)

    IF (AccR4 = (AccTem - AccUr))
        OrigDrive = .T.
    ELSE
        ?"NOT Original Drive"
    ENDIF
    
    ENDIF

    IF OrigDrive    
        LicIn = 79 + (BITAND(0xFF, BITRSHIFT(AccNa, 24)) % 21)
        K = AccA(LicIn)
        I = BITXOR(K, AccA(1 + BITAND(AccNa, 0xFF)))

        LicType = 0
        IF (I = BITXOR(BITXOR(AccM1, AccM3), BITXOR(AccM4, AccM5)))
            LicType = 1
        ENDIF
        IF (I = BITXOR(BITXOR(AccM1, AccM2), BITXOR(AccM4, AccM5)))
            LicType = 2
        ENDIF

        TokenId1 = BITXOR(AccM7, AccA(2 + BITAND(0xFF, AccNa)))
        TokenId2 = BITXOR(AccM8, AccA(2 + BITAND(0xFF, BITRSHIFT(AccNa,  8))))
        
        K = (BITXOR(AccM8, AccM9) % 64) + 1
        DriveChar = CHR(BITXOR(AccA(LicIn - 8), AccA(K)) + 65)
        
        ?"Original Drive:  ", DriveChar
        ?
        ?"License Type = ", LicType
        ?"TokenId1 = ", TokenId1
        ?"TokenId2 = ", TokenId2
    ENDIF
    
ENDPROC
Abs.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por Kapiaba »

Baseado nestes exemplos:

Código: Selecionar todos

PROCEDURE Ascii2UTF8(pcString) 
  LOCAL cBuff, c, i, h, l 

  cBuff = "" 
  FOR i = 1 TO LEN(pcString) 
   c = ASC(SUBS(pcString,i,1)) 
   IF c < 128 
    cBuff = cBuff + CHR(c) 
   ELSE 
    h = BITOR(BITRSHIFT(c,6),0xC0) // hb_bitOr( BitRShift(c,6),0xC0 )   
Function similar to "BitRShift()" in harbour ?? 
    l = BITOR(BITAND(c,0x3F),0x80) // hb_BITOR( hb_BITAND(c,0x3F),0x80) 
    cBuff = cBuff + CHR(h) + CHR(l) 
   ENDIF 
  ENDFO
  R
RETURN cBuff

Código: Selecionar todos

*   Basado en informacion de wikipedia: 
*   http://en.wikipedia.org/wiki/UTF-8 
* 
PROCEDURE UTF82Ascii(pcString) 
  LOCAL cBuff, i, nAsc, c 
  nAsc = 0 
  cBuff = "" 
  FOR i = 1 TO LEN(pcString) 
   * 
   c = ASC(SUBS(pcString,i,1)) 
   IF c < 128 
    IF nAsc > 0 
     cBuff = cBuff + CHR(nAsc) 
     nAsc = 0 
    ENDIF 
    cBuff = cBuff + CHR(c) 
   ELSE 
    IF BITTEST(c,6) 
     nSize = BITRSHIFT(BITAND(c,0x60),5)             // ?? 
     nAsc = BITLSHIFT(BITCLEAR(BITCLEAR(c,7),6),6 * (nSize - 1)) // ?? 
    ELSE 
     nAsc = BITOR(nAsc, BITCLEAR(BITCLEAR(c,7),6))    // 
    ENDIF 
   ENDIF 
   * 
  ENDFOR 

RETURN cBuff
Voce pode usar:

Código: Selecionar todos

   hb_UTF8ToStr( cString )
   hb_StrToUTF8( cString )
Abs
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por HASA »

:-o :-O
Kapi, na verdade o trama aqui é para conseguir imprimir o QRcode do SAT certinho, você tem alguma dica ?

HASA
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

FUNÇÃO BITRSHIFT()

Mensagem por Kapiaba »

Pode ser em Fivewin the best? No me gusta harbour ou xHarbour modo console.
Responder