2011年11月9日 星期三
信用卡機
引用:
--
1.LRC是checksum用.應是針對(Data[]+ETX)作XOR的結果.
Data=Data[0];
for ( i=1; i < length; i++ ) Data = Data xor Data[i];
LRC=Data xor ETX;
2.在將 (header data if need)+ Data[]+ETX+LRC +(tail data if need) 送到前端設備.
CRC、Checksum、VRC、LRC之比較(1.使用bit數的多寡 2.作法上的使用 3.佔記憶空間 4.是否會誤判之排行榜)
CRC(循環冗餘檢查碼,Cyclic Redundancy Check),目前較常使用的位元數目有8、16或32,一般縮寫為CRC-8、CRC-16、CRC-32。根據理論統計,CRC-16可完全偵測資料區塊內單一或兩個位元的錯誤、奇數個位元的錯誤、連續16個位元或少於此數的錯誤,超過17個連續位元的錯誤偵測率則有99.9969%,其它位元長度的錯誤偵測率則可達99.9984%。XMODEM、Kermit等通訊協定,PC 的磁碟機、FDDI、乙太網路和「光纖通道」使用CRC驗證。
Checksum(總和檢查)使用的位元數沒有特別提到。Apple個人電腦的磁碟機是利用checksum驗證資料的正確性。
VRC(垂直冗餘檢查,Vertical Redundancy Check)是對每一個傳送字元(一般是8位元)都增加一個額外位元。
LRC(縱向冗餘檢查,Longitudinal Redundancy Check)也是對每一個傳送字元(一般是8位元)都增加一個額外位元。磁帶資料及透過通訊線路傳送的資料可用LRC驗證。
錯誤檢查所佔用的記憶體空間應與使用的位元數有正相關,誤判的機率應與使用的位元數有負相關,但是詳細的數字還是請您查看書籍與相關研究報告(不過對於VRC和LRC的討論及比較相當少)。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
Procedure ConnectPrint(var aHandle : THandle);//開始連結COM1
function GetTransData : String;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
aHandle : THandle;
lrc : Longword;
s, s1 : string;
i : Integer;
bb : byte;
begin
//開啟COM1
ConnectPrint(aHandle);
//送出要求(144BYTE)
s := GetTransData;
s1 := s;
//取得lrc的值
for i := 0 to length(s) - 1 do
begin
bb := byte(s[i]);
s1[i] := chr(bb xor 3);
end;
S := PCHAR(CHR($02) + S + CHR($03) + S1);
WriteFile(aHandle, S , 290, lrc, nil);
//關閉COM1
CloseHandle(aHandle);
end;
procedure TForm1.ConnectPrint(var aHandle : THandle);
var
Temp : String;
dcb : _DCB;
lrc : Longword;
begin
temp := 'COM1';
aHandle := CreateFile(PChar(temp),
GENERIC_READ OR GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0 );
end;
function TForm1.GetTransData: String;
var
aString : String;
begin
{Trans Type ( 2)
Host ID ( 2)
Invoice No ( 6)
Card No (19)
Card Exp Date ( 4)
Trans Amt (12)
Trans Date ( 6)
Trans Time ( 6)
Approval Code ( 9)
Amount 1 (12)
Resp Code ( 4)
Terminal Id ( 8)
Ref No (12)
Amount2 (12)
StoreID (16)
Reserved (13)
}
aString := '01'
+ '02'
+ '000000'
+ '0000000000000000000'
+ '0000'
+ '000000128000'
+ '000000' //6
+ '000000' //6
+ '000000000'//9
+ '000000000000'
+ '0000'
+ '00000000'
+ '00000000'
+ '000000000000'//12
+ '000000000000'//12
+ '00000000000000000'//17
+ '0000000000000';//13
Result := aString;
end;
end.
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言