办理农业银行黑卡办理条件的百事通存储卡需要什么条件呢?

------解决方案--------------------1 清空操作程序崩溃应该没有联系吧! 是不是有什么非法操作吧!
2 设置变量退出,线程安全退出也奔溃,应该是代码有严重的处理bug了
3 自己处理内存问题呗
4 贴出来你的部分代码处理吧!
处理好线程之间同步问题就好!------解决方案--------------------最好不要在线程外面控制线程,看得不大明白,感觉结构体定义得怪怪的。
不如上代码------解决方案--------------------
Quote: 引用:
最好不要在线程外面控制线程,看得不大明白,感觉结构体定义得怪怪的。
不如上代码
前人写的。。离职了。。客户又要东西。。
让我这13界毕业的。。界面木有,底层没完成,插件木有,全自己搞。。当锻炼了。。
........没文档,没注释什么的么?前面的那个人什么态度啊,太不敬业了。------解决方案--------------------学习了,呜呜呜------解决方案--------------------
Quote: 引用:
1 清空操作程序崩溃应该没有联系吧! 是不是有什么非法操作吧!
2 设置变量退出,线程安全退出也奔溃,应该是代码有严重的处理bug了
3 自己处理内存问题呗
4 贴出来你的部分代码处理吧!
处理好线程之间同步问题就好!
1.我调试了。。清空队列后。有的线程恰好在出队。。拿到了空。。后面肯定崩。
p_par_date_ = queue_-&DataA(); //从DataA中取出数据处理。。
if(p_par_date_)
SetStatus(kRunning);
DataB data_b = DoSome();
//处理DataA数据。。转为DataB
xdelete(p_par_date_);
p_par_date_ = NULL;
queue_-&EnDataB(data_b);
//DataB进入队列。给后面线程处理。
Sleep(100);
SetStatus(kFree);
} while (true);
SetStatus(kFinish);
ABCD四个基本都是这么处理的数据的。
手动停止。
for(auto pThread = curls_.begin(); pThread != curls_.end(); ++pThread )
(*pThread )-&Stop();
//该如何stop是好。。
delete *pT
其他几个线程也是一样的。
1.我调试了。。清空队列后。有的线程恰好在出队。。拿到了空。。后面肯定崩。
这个肯定是你的同步没有做好!清空应该是线程都出对完成之后才做的操作了
2 几个线程最好考虑分开来处理好!不要循环一起处理!------解决方案--------------------线程停止的代码怎么写的?
一般应该这样来
GetExitCodeThread(m_pThread-&m_hThread,&dwExit);
if(TerminateThread(m_pThread-&m_hThread,dwExit)){
m_bThreadRuning=
}------解决方案--------------------暂停(SuspendThread),恢复(ResumeThread),(偶尔会卡死界面,很奇怪)???
处理"暂停(SuspendThread),恢复(ResumeThread)"
操作的线程(有可能是主线程),不要和暂停中的线程使用同一把锁,否则处理过程会卡,或者死锁
因为 暂停的线程 ,它的锁到就不会释放了,如果处理线程,非要得到那把锁,才能恢复被锁住的线程,就形成死锁.
而 有些系统的控制台输入输出(编译器和对应的库),是同步的(会在某些时候锁住输入或者输出)
如果某个线程正在输出(输出被锁住),并且没有完成,就被暂停了,那么永远等不到,输出解锁.
此时 调度程序要输出的话,就会死锁.
通过暂停,恢复操纵其他线程的那个线程,不要死等 被操纵线程用到的锁.
不要死等的意思是
1)不要等待无穷大时间
2)循环等待时间间隔要短暂,不要等待1s 这种,长时间等待,
中间要插入其他操作,以便合理处理任务调度.------解决方案--------------------仅供参考//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef WIN32
#pragma warning(disable:4996)
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#ifdef WIN32
#include &windows.h&
#include &process.h&
#include &io.h&
_vsnprintf
#include &unistd.h&
#include &sys/time.h&
#include &pthread.h&
CRITICAL_SECTION
pthread_mutex_t
#define MAXLOGSIZE
#define MAXLINSIZE 16000
#include &time.h&
#include &sys/timeb.h&
#include &stdarg.h&
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
void sleep_ms(int ms) {
Sleep(ms);
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
void sleep_ms(int ms) {
usleep(ms*1000);
void LogV(const char *pszFmt,va_list argp) {
struct tm *
if (NULL==pszFmt------解决方案--------------------0==pszFmt[0])
vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now-&tm_year+1900,now-&tm_mon+1,now-&tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now-&tm_hour
,now-&tm_min
,now-&tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)&MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
fclose(flog);
void Log(const char *pszFmt,...) {
Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
#define ASIZE
#define BSIZE
#define CSIZE
char Abuf[ASIZE];
char Cbuf[CSIZE];
CRITICAL_SECTION cs_HEX ;
CRITICAL_SECTION cs_BBB ;
struct FIFO_BUFFER {
char data[BSIZE];
int No_Loop=0;
void HexDump(int cn,char *buf,int len) {
int i,j,k;
char binstr[80];
Lock(&cs_HEX);
for (i=0;i&i++) {
if (0==(i%16)) {
sprintf(binstr,"%03d %04x -",cn,i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s
",binstr);
for (j=i-15;j&=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
Log("%s\n",binstr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j&k;j++) {
sprintf(binstr,"%s
",binstr);
sprintf(binstr,"%s
",binstr);
for (j=i-k;j&i;j++) {
sprintf(binstr,"%s%c",binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
Log("%s\n",binstr);
Unlock(&cs_HEX);
int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
if (fbuf-&size&=len) {
if (fbuf-&head+lent&BSIZE) {
len1=BSIZE-fbuf-&
memcpy(buf
,fbuf-&data+fbuf-&head,len1);
len2=lent-len1;
memcpy(buf+len1,fbuf-&data
fbuf-&head=len2;
memcpy(buf
,fbuf-&data+fbuf-&head,lent);
fbuf-&head+=
fbuf-&size-=
Unlock(cs);
MYVOID thdB(void *pcn) {
Log("%03d thdB
thread begin...\n",cn);
while (1) {
sleep_ms(10);
recv_buf=(char *)C
recv_nbytes=CSIZE;
while (1) {
pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
Log("%03d recv %d bytes\n",cn,pb);
HexDump(cn,recv_buf,pb);
sleep_ms(1);
sleep_ms(1000);
if (No_Loop)//
if (wc&3600) Log("%03d %d==wc&3600!\n",cn,wc);
if (No_Loop)//
#ifndef WIN32
pthread_exit(NULL);
int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
if (fbuf-&size+lent&BSIZE) {
lent=BSIZE-fbuf-&
if (fbuf-&tail+lent&BSIZE) {
len1=BSIZE-fbuf-&
memcpy(fbuf-&data+fbuf-&tail,buf
len2=lent-len1;
memcpy(fbuf-&data
,buf+len1,len2);
fbuf-&tail=len2;
memcpy(fbuf-&data+fbuf-&tail,buf
fbuf-&tail+=
fbuf-&size+=
Unlock(cs);
MYVOID thdA(void *pcn) {
Log("%03d thdA
thread begin...\n",cn);
while (1) {
sleep_ms(100);
memset(Abuf,a,ASIZE);
a=(a+1)%256;
if (16==a) {No_Loop=1;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
send_buf=(char *)A
send_nbytes=ASIZE;
Log("%03d sending %d bytes\n",cn,send_nbytes);
HexDump(cn,send_buf,send_nbytes);
while (1) {
pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
Log("%03d sent %d bytes\n",cn,pa);
HexDump(cn,send_buf,pa);
send_buf+=
send_nbytes-=
if (send_nbytes&=0)//
sleep_ms(1000);
if (No_Loop)//
if (wc&3600) Log("%03d %d==wc&3600!\n",cn,wc);
if (No_Loop)//
#ifndef WIN32
pthread_exit(NULL);
int main() {
#ifdef WIN32
InitializeCriticalSection(&cs_log);
InitializeCriticalSection(&cs_HEX );
InitializeCriticalSection(&cs_BBB );
pthread_t threads[2];
int threadsN;
pthread_mutex_init(&cs_log,NULL);
pthread_mutex_init(&cs_HEX,NULL);
pthread_mutex_init(&cs_BBB,NULL);
Log("Start===========================================================\n");
BBB.head=0;
BBB.tail=0;
BBB.size=0;
#ifdef WIN32
_beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
_beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);
threadsN=0;
rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
if (!access("No_Loop",0)) {
5.《程序猿扯淡系列》食货的理想-健康从吃开始
5.《程序猿扯淡系列》吃货的理想--健康从吃开始若干年后,我只希望我的子孙在清明节的时候,给我祭上苏丹红、三鹿、地沟油这些,不然我会不习惯啊,最好是照着元素
周期表每种元素来一样。不知道满汉全席是不是这样来的。
你还在为吃得不放心而不安吗?你还在为每天吃什么而烦恼吗?本人承接各种小炒、红烧、清蒸、水煮等业务,此外还
有免费培训厨艺,手把手教你成为一代宗师,是新手入门必备,老手进阶之法;经验老道,选料安全,价格实惠,有意者请
联系。如此待你学成之后,也许以后的某一天,你去丈母娘家,你的妻子和丈母娘在客厅看着电视,你和你的岳父在厨房忙
今天,这里的今天指的是我写这篇博客的“今天”,今天是我从闭关之后出山第一次炒菜,竟然烧焦了,真是令我大开眼
界,我一直认为这是在做梦,好好好,这说明我的提升空间还是挺大的。然而,当我洗锅的时候,我竟然发现这电磁炉高科
技竟然有温度调节按钮,直令我虎躯一震,菊花微紧。我似乎找到了出现那悲剧的原因了,这他娘的,出厂默认的温度是谁
调那么高?好好好,今天完全是失误,直接原因是因为没看需求文档,哦是技术文档。
如今,上班族大多都吃着快餐或者类似的食物,特别是我们程序猿,加班更是常事,长期下去,势必胃等器官出现bug,
而这时你再去debug,这年代的医药费,代价你懂的。所以,最好是要有健康这个意识,好的意识就如一个好的框架,引用
之后给你减少很多不必要的麻烦,大大减少出bug的概率。再好的饭店,也不如自己动手做的吃得放心,虽然不能保证所有
原料的安全,但从加工这个过程是由你控制的。我在外面吃饭,一直有上火的症状,上火:中医是指人体阴阳失衡,内火旺
盛。关于上火这个词,不便作更多解释,有的人的上火并不是我指的那个上火,他们的上火解决的方法并不是我指的上火对
应的降火解决方法,好好好,下限再一次降低了。
根据有关检测部门Mr lying砖家透露,中国的安全食品名单有:
。以上就是我
国进入安全食品的名单,请各位市民放心购买。其实,我只希望我的一天是这样的:早起,买根地沟油油条,切个苏丹红鸡
蛋,冲杯三聚氰胺牛奶去上班,中午,瘦肉精猪肉炒敌敌畏莴笋,加一碗石蜡翻新陈米饭,泡一壶香精茶。下班后,买一条
避孕药鱼,尿素豆芽,打激素西红柿,石膏豆腐,回到豆腐渣工程天价房,吃个增白剂加吊白块和硫磺熏蒸的馒头,饭后抽
根高汞烟,回去上一会盗版的xp系统,晚上盖着黑心棉,核辐射算啥?很严重吗?虽然上面这些是我的梦想,但依我目前的
生存状况来看,要达到这个标准还需努力奋斗,但是我必须坚强的活着,因为,听说墓地又涨价了。所以我认为题目的最后
少了个“问号”。
delphi对IC卡编程初次者请问
delphi对IC卡编程初次者请教各位高手:小弟初次接触IC卡,只看了一些参考书,晕!想请教一些问题,谢谢!(用敏华接触式读卡器)1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?总之,对ic卡的知识极度匮乏,各位费心了!这好象和计算机的读写方式不一样吧------解决方案--------------------我有一点 mifire 1的资料, 别的卡也大同小异,供参考二、 存储结构1、 M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示: 块0
数据块 0扇区0
数据块 1 块2
数据块 2 块3 密码A
密码B 控制块 3
数据块 4扇区1 块1
数据块 5 块2
数据块 6 块3 密码A
密码B 控制块 7
∶      ∶      ∶
数据块 60扇区15
密码B 控制块 632、 第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。3、 每个扇区的块0、块1、块2为数据块,可用于存贮数据。
数据块可作两种应用:★ 用作一般的数据保存,可以进行读、写操作。★ 用作数据值,可以进行初始化值、加值、减值、读值操作。4、 每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:
密码A(6字节)
存取控制(4字节) 密码B(6字节) 5、 每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:
C33 三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如
进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制 位在存取控制字节中的位置,以块0为例:
对块0的控制:
C10_b字节7
C30_b字节8
( 注: C10_b表示C10取反 )
存取控制(4字节,其中字节9为备用字节)结构如下所示:
0字节6 C23_b C22_b C21_b C20_b C13_b C12_b C11_b C10_b字节7 C13 C12 C11 C10 C33_b C32_b C31_b C30_b字节8 C33 C32 C31 C30 C23 C22 C21 C20字节9
( 注: _b表示取反 )
6、数据块(块0、块1、块2)的存取控制如下: 控制位(X=0.1.2)
访 问 条 件 (对数据块 0、1、2)C1X C2X C3X
Increment Decrement, transfer,Restore0 0 0 KeyA|B KeyA|B KeyA|B KeyA|B0 1 0 KeyA|B Never Never Never1 0 0 KeyA|B KeyB Never Never1 1 0 KeyA|B KeyB KeyB KeyA|B0 0 1 KeyA|B Never Never KeyA|B0 1 1 KeyB KeyB Never Never1 0 1 KeyB Never Never Never1 1 1 Never Never Never Never
(KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现) 例如:当块0的存取控制位C10 C20 C30= 1 0 0时,验证密码A或密码B正确后可读;
验证密码B正确后可写;不能进行加值、减值操作。
7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
密码A 存取控制 密码BC13 C23 C33 Read Write
Read Write Read Write0 0 0 Never KeyA|B KeyA|B Never KeyA|B KeyA|B0 1 0 Never Never KeyA|B Never KeyA|B Never1 0 0 Never KeyB KeyA|B Never Never KeyB1 1 0 Never Never KeyA|B Never Never Never0 0 1 Never KeyA|B KeyA|B KeyA|B KeyA|B KeyA|B0 1 1 Never KeyB KeyA|B KeyB Never KeyB1 0 1 Never Never KeyA|B KeyB Never Never1 1 1 Never Never KeyA|B Never Never Never
例如:当块3的存取控制位C13 C23 C33= 0 0 1时,表示:
密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读、可写。
密码B:验证KEYA或KEYB正确后,可读、可写。新卡片中的控制字为:“FF 07 80 69”,其定义中说明密码A可用,密码B不可用,新卡中所有密码A都为6个字节的“FF”;
推荐的控制字方案一:7F 07 88 69
此控制字说明:数据块:用密码A或B都可以读写;
控制块:密码A:由密码B来写,不可读;
密码B:由密码B来写,不可读;
控制字:用密码A或B都可读,由密码B写;方案二:08 77 8F 69
此控制字说明:数据块:用密码A读,由密码B读写;
控制块:密码A:由密码B来写,不可读;
密码B:由密码B来写,不可读;
控制字:用密码A或B都可读,由密码B写;三、 卡片卡片的电气部分只由一个天线和ASIC组成。天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个
8K位EEPROM组成。四、对数据块的操作
读 (Read):读一个块;
写 (Write):写一个块;加(Increment):对数值块进行加值;减(Decrement):对数值块进行减值;存储(Restore):将块中的内容存到数据寄存器中;传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;------解决方案--------------------1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
给你卡的供应商,应该不是生产商,可能是一些做卡应用行业的公司,他们拿给你的卡,并且说已初始化,则很可能是加密码了,只能他们自己的设备来使用。2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
不会烧掉的。16个扇区,除了0扇区的密码不提供外,其他的都是12个f3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
这个不懂。4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
这个也不懂。总之,对ic卡的知识极度匮乏,各位费心了!这好象和计算机的读写方式不一样吧附资料,你看一下:/view/4189.htm
------解决方案--------------------1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
给你卡的供应商,应该不是生产商,可能是一些做卡应用行业的公司,他们拿给你的卡,并且说已初始化,则很可能是加密码了,只能他们自己的设备来使用。 haochin回答的正确,应该是供应商提前将卡内设置密码了,你在读写该卡时都需要用密码提前验证,因此你必须问供应商要到该密码。2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
确切的说如果密码多次错误,会导致卡锁死,倒不至于烧掉,当然卡锁死的话,也就不能再对该卡进行读写了。至于密码,是厂家自己定的出厂密码,肯定会告诉你的,否则你读写卡是无法通过密码验证,而且这个密码一般还允许自行设定,所以你编程的时候肯定要用的密码。3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
数据的读写一般是2进制或16进制,而是否需要知道地址,这个需要根据厂家提供的通讯协议来确定4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
上下电是一次读写卡的操作步骤而已,你想象成开始,结束就行。比如一次读写卡的步骤是:上电,判断读卡器有卡,验证卡密码,读写卡数据,下电------解决方案--------------------要回答你的问题,首先要搞清楚你用的是接触式的IC卡还是非接触式的IC卡前面的回答均是针对非接触式IC卡来的,但我看你用的应该是接触式的IC卡,应为你提到你用的是明华的接触式读写器。如果你用的是接触式的IC卡,那么答案应该就不一样了。1:两种卡是一样的,初始化的意思应该是修改了原始的密码,也即是说已经写了新密码了2:非接触式IC卡的密码可以随便校验,密码错了再试多少次也没有问题,但接触式的IC卡应该是试了N次后卡会被锁死的。如果你要对其编程,一般来说两种卡都需要知道密码。3:读写卡要通知读写器我要读写哪个区那个块4:卡内有芯片,存储了数据,没有电怎么读?只不过两种卡的电的来源不一样。一般明华的读写器都附带有很详细的说明,你可以看看说明。
------解决方案--------------------你可以将卡理解成一张白纸,你要做的事情就是通过程序控制能向这张纸写字的笔(也就是读卡器)操作这张纸。1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
答:我估计和你联系的应该是供应商而不是生产商。二者区别在于生产商提供的卡片都是白卡(也可以理解成一张白纸,即使有密码也是公开的,关于密码问题我在回答你的第二个问题时再多说几句),而供应商很可能是和卡配套软件的提供者,他们为了自己的利益(同时也可以提高系统的安全性),修改卡的密码,同时将部分初始信息写入卡内,这就是所谓的“初始化”。2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
答:首先,你应明确你卡的型号(这是你的所有问题中最最重要的,也是要准确回答你的问题前所必须知道的)。目前,市场上常见的卡片有id卡(非接触式,多用于学校或企业一卡通,无密码),逻辑加密卡(目前应用较少,以前的Ic卡电话或某些地区的驾驶员卡均属此类,有密码),非接触卡(典型型号为2楼提到的mifare系列,常应用于各地区城市一卡通,或公交卡,及企业及学校一卡通等,mifare系列有密码,其他多无密码),cpu卡(价格较高,只在银行等少数领域应用,有密码)等等。其中逻辑加密卡或cpu卡如连续几次密码错误,卡会烧掉,mifare不会烧卡(因你提到会烧卡,所以我估计你的卡不是mifare系列的)。如生产商提供卡片,密码均为初始密码,如软件供应商提供,则非常可能被其修改,且不愿提供(不提供,你只能从他那里买卡,提供了,你可以随处买卡)。编程时,密码是否要写在程序中应视你要实现的目的而定,多数逻辑加密卡不需密码即可读卡,其他带密码的卡通常需密码认证通过后才可读取数据,但各种带密码的卡基本上都是密码认证通过后才可写卡的,所以估计你很可能要将密码写入程序中。3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).答:什么进制是无所谓,关键是看你调用的读卡器的函数接口是哪个数据类型(例如是数字类型,则你传入16进制的FF和10进制的255效果是一样的,但如是字符串类型,你就必须按照对方要求来使用了)至于具体地址数,这个问题还是要看具体型号了。对于非cpu卡来说,型号确定就意味着卡的容量等特性确定,而cpu卡都有自己的cos(即操作系统),就只能看cos手册了。至于是否块操作,也和卡的类型和型号有关,逻辑加密卡多是按字节操作,mifare等卡是块操作(以最常见的mifare 1 s50来说,以块为单位操作,每块16字节。也就是说,你即使想读写1个字节,也需要读写该字节所在块的那16个字节),至于cpu卡,其自身有操作系统,多为文件操作。
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
答:多数卡本身是无源的,因此操作时必须先上电,至于下电,实际上对很多卡来说不是必须的(但强烈建议你执行下电步骤)。举个例子来说,你向计算机插入了一个u盘,不正常停止后再拔出u盘通常也没问题,但恐怕没有几个人不停止后再拔出u盘的。说了不少,但因为不知道具体卡的具体类型和型号,无法给出非常准确的解决方案。需要lz先明确型号,才可以详细讨论如何解决。^_^
------解决方案--------------------1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?答:初始化就是向IC卡里写入了认证密码(IC卡出厂的时候默认为空密码),对写入认证密码之后的IC卡读写,必须使用相同的密码认证,否则就无法对IC卡读写,应用程序的初始化应该是读卡器芯片的初始化吧。你拿的IC卡,发卡操作时读卡器就对IC卡进行了初始化。
2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
答:这个密码是读卡器和IC卡之间通讯的认证秘钥,如果供应商不原意提供,就是说读卡器初始化卡的时候写入了一个只有读卡器供应商知道的、固定的密码,你就不需要管这个密码了。如果读卡器厂商提供的应用接口可以改写这个密码,你就要管理起这个密码了。也就是初始化卡时你写入什么密码,你读写这些初始化过的卡时,必须使用相同的密码来认证。3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).答:卡存储分块,区。不同的卡容量不同,根据卡片类型对应处理。
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?答:上电有点奇怪,如果卡片拿到了读卡器的射频区(读卡器通过固定频率如13.56M发射射频能量,通讯的编码调制在这个固定频率上),IC卡的线圈接收射频能量,可能就几个mS,IC卡的电路充电后就可以正常工作了,也就算是上电吧。IC卡的内容读写之前需要一系列的认证步骤。真正的下电就是把IC卡从读卡器的射频区移开。这里的下电可能是指IC卡的IDLE吧,IC卡休眠之后就不再响应读卡器的通讯请求了(当然如果从射频区移开,IC卡电路冷重启之后就可以相应请求了)。因为读卡器读卡是快速定时扫描的,比如1秒钟50次,如果你不休眠,可能会在你刷卡的一两秒钟之间,发生多次读写(可能就多次扣钱了,呵呵)。------解决方案--------------------1)有区别2)密码由用户输入3)你用的可能是纯数据存储卡4)没听说过。------解决方案--------------------
你可以将卡理解成一张白纸,你要做的事情就是通过程序控制能向这张纸写字的笔(也就是读卡器)操作这张纸。1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?答:我估计和你联系的应该是供应商而不是生产商。二者区别在于生产商提供的卡片都是白卡(也可以理解成一张白纸,即使有密码也是公开的,关于密码问题我在回答你的第二个问题时再多说几句),而供应商很可能是和卡配套软件的提供者,他们为了自己的利益(同时也可以提高系统的安全性),修改卡的密码,同时将部分初始信息写入卡内,这就是所谓的“初始化”。2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?答:首先,你应明确你卡的型号(这是你的所有问题中最最重要的,也是要准确回答你的问题前所必须知道的)。目前,市场上常见的卡片有id卡(非接触式,多用于学校或企业一卡通,无密码),逻辑加密卡(目前应用较少,以前的Ic卡电话或某些地区的驾驶员卡均属此类,有密码),非接触卡(典型型号为2楼提到的mifare系列,常应用于各地区城市一卡通,或公交卡,及企业及学校一卡通等,mifare系列有密码,其他多无密码),cpu卡(价格较高,只在银行等少数领域应用,有密码)等等。其中逻辑加密卡或cpu卡如连续几次密码错误,卡会烧掉,mifare不会烧卡(因你提到会烧卡,所以我估计你的卡不是mifare系列的)。如生产商提供卡片,密码均为初始密码,如软件供应商提供,则非常可能被其修改,且不愿提供(不提供,你只能从他那里买卡,提供了,你可以随处买卡)。编程时,密码是否要写在程序中应视你要实现的目的而定,多数逻辑加密卡不需密码即可读卡,其他带密码的卡通常需密码认证通过后才可读取数据,但各种带密码的卡基本上都是密码认证通过后才可写卡的,所以估计你很可能要将密码写入程序中。3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).答:什么进制是无所谓,关键是看你调用的读卡器的函数接口是哪个数据类型(例如是数字类型,则你传入16进制的FF和10进制的255效果是一样的,但如是字符串类型,你就必须按照对方要求来使用了)至于具体地址数,这个问题还是要看具体型号了。对于非cpu卡来说,型号确定就意味着卡的容量等特性确定,而cpu卡都有自己的cos(即操作系统),就只能看cos手册了。至于是否块操作,也和卡的类型和型号有关,逻辑加密卡多是按字节操作,mifare等卡是块操作(以最常见的mifare 1 s50来说,以块为单位操作,每块16字节。也就是说,你即使想读写1个字节,也需要读写该字节所在块的那16个字节),至于cpu卡,其自身有操作系统,多为文件操作。4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?答:多数卡本身是无源的,因此操作时必须先上电,至于下电,实际上对很多卡来说不是必须的(但强烈建议你执行下电步骤)。举个例子来说,你向计算机插入了一个u盘,不正常停止后再拔出u盘通常也没问题,但恐怕没有几个人不停止后再拔出u盘的。说了不少,但因为不知道具体卡的具体类型和型号,无法给出非常准确的解决方案。需要lz先明确型号,才可以详细讨论如何解决。^_^
------解决方案--------------------给你点实际的吧,我前几天做的IC写卡程序,都在用基本没问题,读卡器不一样但原理和过程是类似的。基本流程:1.初始化串口通讯,2.检查读卡器状态,3.检验卡型,4.检验密码,5.写卡/读卡,6.修改密码及及其它,7.退出先看界面:------解决方案--------------------
代码部分:Delphi(Pascal) code
unit WriteIC4428_RemovingEndN
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, B
TPCH_Write_IC_Card4428 = class(TForm)
rb_IsWriteMainCard: TRadioB
lst_ReadWriteInfo: TListB
rb_IsWriteAttachCard: TRadioB
grp__1: TGroupB
grp__2: TGroupB
grp__3: TGroupB
edt_CardPWD: TE
edt_WritePosition_Byte: TE
btn_OpenInterface: TBitB
btn_VerifyCardPwd: TBitB
btn_ReadCard: TBitB
btn_ClearListBoxRec: TBitB
btn_Exit: TBitB
btn_WriteCard: TBitB
edt_CardMainNo: TE
edt_CardFirstNo: TE
edt_AttachCardEndNo: TE
grp__4: TGroupB
edt_WriteCardNum: TE
btn_ChangeCardPWD: TBitB
btn_ClosePort: TBitB
procedure btn_OpenInterfaceClick(Sender: TObject);
procedure btn_VerifyCardPwdClick(Sender: TObject);
procedure btn_WriteCardClick(Sender: TObject);
procedure btn_ExitClick(Sender: TObject);
procedure btn_ReadCardClick(Sender: TObject);
procedure btn_ChangeCardPWDClick(Sender: TObject);
procedure btn_ClearListBoxRecClick(Sender: TObject);
procedure btn_ClosePortClick(Sender: TObject);
procedure FormClose(Sender: TO var Action: TCloseAction);
procedure edt_CardMainNoChange(Sender: TObject);
procedure edt_AttachCardEndNoChange(Sender: TObject);
{ Private declarations }
{ Public declarations }
PCH_Write_IC_Card4428: TPCH_Write_IC_Card4428;
ClickNum:I
MainCardNum:string[10];
RW_MainCardNum:string[20];
RW2_MainCardNum:string[44];
RW2_AttachCardNum:string[48];
// ----------------------------------------------
outbuff: //输出缓冲区_主卡
inbuff: //输入缓冲区
implementation
{$R *.dfm}
uses drv_unit_D6;
// 打开串口
procedure TPCH_Write_IC_Card4428.btn_OpenInterfaceClick(Sender: TObject);
ClickNum:=0;
icdev := IC_InitComm(100);
If icdev & 0 Then
lst_ReadWriteInfo.Items.Add('打开端口出错!请检查端口是否被占用或设备是否已连接!');
lst_ReadWriteInfo.Items.Add('打开端口成功!');
PCH_Write_IC_Card4428.btn_VerifyCardPwd.Enabled:=T
PCH_Write_IC_Card4428.btn_WriteCard.Enabled:=T
PCH_Write_IC_Card4428.btn_ReadCard.Enabled:=T
PCH_Write_IC_Card4428.btn_ChangeCardPWD.Enabled:=T
PCH_Write_IC_Card4428.btn_ClosePort.Enabled:=T
st := IC_Status(icdev);
If st &0 Then begin
lst_ReadWriteInfo.Items.Add('读写器存在错误!');
lst_ReadWriteInfo.Items.Add('读写器状态正常!');
If st &0 Then
If st = 1 then
Windows.Beep(300,600);
lst_ReadWriteInfo.Items.Add('&&&&&&&&&&&没有检测到卡,请重新插卡!');
st := IC_ExitComm(icdev);
//关闭串口
lst_ReadWriteInfo.Items.Add('检测到卡!');
st := IC_InitType(icdev, 4);
//给卡型号
If st = 0 Then
lst_ReadWriteInfo.Items.Add('卡型检测成功!');
lst_ReadWriteInfo.Items.Add('卡型检测失败!');
//校验密码
procedure TPCH_Write_IC_Card4428.btn_VerifyCardPwdClick(Sender: TObject);
st := IC_ReadCount_SLE4428(icdev);
If st & 0 Then begin
lst_ReadWriteInfo.Items.Add('读芯片SLE出错!');
lst_ReadWriteInfo.Items.Add('读芯片SLE成功!');
lst_ReadWriteInfo.Items.Add('错误记数器为'+inttostr(st));
inbuff:=string(edt_CardPWD.Text);
//核对密码
st := IC_CheckPass_4428hex(icdev,pchar(inbuff));
If st && 0 Then begin
lst_ReadWriteInfo.Items.Add('密码校验失败!');
lst_ReadWriteInfo.Items.Add('密码校验成功!');
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 农业银行黑卡办理条件 的文章

 

随机推荐