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
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
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:
Abs
FUNÇÃO BITRSHIFT()
Enviado: 24 Ago 2016 10:50
por HASA

:-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.