虽然楼主的表述方式多少有些问题,但我根据自己的理解加猜测,得出了楼主的大概意思,大家看看对不对?呵呵,如果错了,请扔些鸡蛋番茄就好了:
1. 既然DLL“接口函数一次读取IC卡内的十六个字节组成32个字节的十六进制”,因此可以得出这么个结论:一组16个字节的数据经过某种转换规则以后需要用32个字节的数据来表示。那么,抛开楼主的应用里面存在一些特殊的、不为别人所知的转换规则这种可能性不谈,在现实世界里还有什么类似又众所周知的转换规则呢?--如果大家理解了我的意思,那不知道有没有人很凑巧也跟我一样想到了一个绝大多数程序员都应该知道的规则:一个8位的字节数据需要用两位16进制数表示,那么如果为了以字符的形式存储这两位16进制数,就需要两个字符也就是两个字节(因为一个ASCII字符需要一个字节的存储空间,别告诉我你不知道这一点,呵呵[8D])。OK,可能你会觉得我这一大段话太罗嗦了,根本不知道我在讲什么,那么我举个再简单不过的例子来试图说明这个“十六个字节组成32个字节的十六进制”的规则是如何运作的--
假设有一个字节的数据--嗯哼,别管它表示什么东西,你只要注意它具体的二进制数据值--啊哈,我假设它是$D8吧(注意,我用的是Delphi的十六进制数表示法)。正如大家看到的,为了表示(这个表示不是指向计算机表示,而是向用户即人表示)这个8位的字节数据,需要用到两位的16进制数,如果要在计算机里面存储这种表示方法而不是字节数据本身的话,那么我们要存储的就是那两个16进制数而不是那个字节--因此我们需要用“两个字节来存储对于一个字节数据值的十六进制表示方式”--而这,就应该是楼主“口函数一次读取IC卡内的十六个字节组成32个字节的十六进制”这句话所真正要表达的意思吧!
2. 如果我的猜测是对的,那么按照这种转换规则,以上面我举的那个$8D字节数据值为例,为了存储它的字符串形式的16进制数表示法,就转换称为了$8 $D 这两个字节数据。
3. 刚才我举了个可以表示任意类型的字节数据作为转换依据,但实际上不管这个字节在程序里面到底具体表示什么类型的数据,其实转换方法跟结果都是一样的。比如说字符串数据,就拿楼主提到的“清华同方”来演示一下吧(注意,这里演示的虽然是string类型的字符串,但对于WideString来说同样是适用的。唯一的区别就是WideString里面所有的字符都是两个字节的,但string里面既有双字节的字符,也有单字节的字符而已。但本质生都是其编码的字节数据值)--
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ca:array [1..16] of char;
implementation
{$R *.dfm}
// 下面这个过程演示了如何将字符串转换为16进制数表示形式的字符数组
procedure TForm1.Button1Click(Sender: TObject)
var
s,tmps:string;
i:integer;
ChrCode,HiBit,LoBit:Byte;
begin
s:='清华同方';
Edit1.Text:=s;
for i:=1 to Length(s) do
begin
ChrCode:=Ord(s);
HiBit:=ChrCode shr 4;
LoBit:=ChrCode and $0F;
if HiBit<$A then
ca[i*2-1]:=Chr(HiBit+$30)
else
ca[i*2-1]:=Chr(HiBit+$37);
if LoBit<$A then
ca[i*2]:=Chr(LoBit+$30)
else
ca[i*2]:=Chr(LoBit+$37);
tmps:=tmps+'$'+ca[i*2-1]+' $'+ca[i*2]+' '
end;
Edit2.Text:=tmps
end;
// 下面这个过程演示了如何将16进制数表示形式的字符数组转换为字符串
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
s:string;
ChrCode,HiBit,LoBit:Byte;
begin
for i:=1 to 8 do
begin
HiBit:=Ord(ca[i*2-1]);
if HiBit in [$30..$39] then
HiBit:=HiBit-$30
else
HiBit:=HiBit-$37;
LoBit:=Ord(ca[i*2]);
if LoBit in [$30..$39] then
LoBit:=LoBit-$30
else
LoBit:=LoBit-$37;
ChrCode:=HiBit shl 4 + LoBit;
s:=s+Chr(ChrCode)
end;
Edit3.Text:=s
end;
end.