Página 1 de 4

FUNÇÃO BITRSHIFT()

Enviado: 20 Ago 2016 11:57
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

FUNÇÃO BITRSHIFT()

Enviado: 20 Ago 2016 14:56
por JoséQuintas
Chute:

Código: Selecionar todos

iLow := Mod( nTamanho, 255 )
iHigh := Int( nTamanho / 255 ) + 2

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 09:53
por HASA
:? :'(

José o QRCode nem imprimiu.
:-O
HASA

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 11:41
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.

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 11:45
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

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 11:48
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()

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 11:55
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.

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 11:56
por HASA
:D
Legal, vou testar, o outro exemplo em Delphi também vou tentar traduzir ok.
T+

HASA

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 12:06
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)

FUNÇÃO BITRSHIFT()

Enviado: 22 Ago 2016 12:12
por JoséQuintas
Me chamou a atenção esta parte:

AnsiChar(chr(iTam1))

Não sei se a codepage pode interferir no resultado.

FUNÇÃO BITRSHIFT()

Enviado: 23 Ago 2016 11:41
por HASA
:(
José tentei compilar com Harbour 3.2 mas... não reconheceu a Hb_BITRSHIFT().
HASA

FUNÇÃO BITRSHIFT()

Enviado: 23 Ago 2016 11:54
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.

FUNÇÃO BITRSHIFT()

Enviado: 23 Ago 2016 12:04
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

FUNÇÃO BITRSHIFT()

Enviado: 24 Ago 2016 10:50
por HASA
:-o :-O
Kapi, na verdade o trama aqui é para conseguir imprimir o QRcode do SAT certinho, você tem alguma dica ?

HASA

FUNÇÃO BITRSHIFT()

Enviado: 24 Ago 2016 11:03
por Kapiaba
Pode ser em Fivewin the best? No me gusta harbour ou xHarbour modo console.