亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? testpad03.c

?? 讀卡器編程實例------Reader programming examples
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************
 *
*                             TestPad03.C   V1.0.0.0
 *
 *							  用于測試PAD03的接口函數
 *
 * Author        :- Shen Qun
 * System        :- VC 6.0 or STAR POS
 * Last modified :- 2006.12.19 
 * Funciton		 :- Test Api for pinpad 
 *
 * Copyright     : Copyright 2006 LANDI
 * notice        : All rights reserved.
 ******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "LD_Reader.h"

extern unsigned char	CARD_STATUS, CARD_SW1, CARD_SW2;
#define CLA_CODE	0x00
void					debug_disps(char line, char *_data, int len);

unsigned char			reader_type = 255;

void display_ic_status(void)
{
#ifdef _POS_
	displays(7, 1, "STATUS=%02x SW1SW2=%02x%02x", CARD_STATUS, CARD_SW1, CARD_SW2);
#else
	printf("STATUS=%02x, SW1=%02x, SW2=%02x\n", CARD_STATUS, CARD_SW1, CARD_SW2);
#endif
}

#ifndef _POS_

// 用于Windows下函數測試
void display_cen(int line, char *data)
{
	printf("%s", data);
}

void display_inv(int line, char *data)
{
	printf("%s", data);
}

void displays(int line, int col, char *format, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, format);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(format, arg);

	va_end(ap);					/* Variable argument end */
}

void display(int line, char *format, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, format);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(format, arg);

	va_end(ap);					/* Variable argument end */
}

void debug_disps(char line, char *_data, int len)
{
	int i;

	for (i = 0; i < len; i++)
	{
		display(1, "%02X ", (unsigned char) _data[i]);
	}

	display(1, "\n");
}

int inkey(int time)
{
	return 0;
}

void clearall()
{
}

void cls()
{
}

void ResetTime()
{
}

#else
void debug_disps(char line, char *_data, int len)
{
	char	str1[20], str2[20];
	int		i, j;

	j = 0;
	do
	{
		memset(str1, 0, 20);
		for (i = 0; i < 8; i++)
		{
			if ((j + i) >= len)
			{
				str1[i * 2] = 0;
				break;
			}

			sprintf(str1 + i * 2, "%02x", _data[j + i]);
		}

		sprintf(str2, "%d~%d of %d", j + 1, j + i, len);
		displays(line, 1, str2);
		displays(line + 1, 1, str1);
		inkey(0);
		j += 8;
	} while (j < len);
}
#endif
#ifndef _POS_
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, pszFmt);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(pszFmt, arg);

	va_end(ap);					/* Variable argument end */
}

#else
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
	char	szDispStr[500];
	va_list VarList;

	va_start(VarList, pszFmt);
	vsprintf(szDispStr, pszFmt, VarList);
	va_end(VarList);

	displays(dln, dlc, "%s", szDispStr);
	return;
}
#endif
int ReaderPowerOn(int expect_code, unsigned char ucReaderHandle)
{
	short			sRet;
	unsigned char	ucTmpBuf[100], ucBufLen;
	unsigned char	ucCardNo = 0;

	sRet = power_up(ucReaderHandle, ucCardNo, ucTmpBuf, &ucBufLen);
	display_ic_status();
	debug_disps(3, (char *) ucTmpBuf, (int) ucBufLen);
	return SUCC;
}

void ReaderAPDU(unsigned int uiLen_APDU, unsigned char *ucCommand_APDU)
{
	unsigned char	ucResponse_APDU[512];
	unsigned char	Lc = 0, Le = 0;
	unsigned char	ucCardNo = 0;
	short			sRet;
	unsigned short	usLen;
	unsigned char	ucReaderHandle = 1;

	usLen = 0;					//處理61 6C

	//usLen = 2;		//不處理 61 6C
	if (uiLen_APDU == 4)		//case 1
	{
		Lc = 0;
		Le = 0;
	}
	else if (uiLen_APDU == 5)	//case 2
	{
		Lc = 0;
		Le = ucCommand_APDU[4];
	}
	else if (uiLen_APDU == (unsigned int) (5 + ucCommand_APDU[4]))	// case 3
	{
		Lc = ucCommand_APDU[4];
		Le = 0;
	}
	else if (uiLen_APDU == (unsigned int) (6 + ucCommand_APDU[4]))	// case 4
	{
		Lc = ucCommand_APDU[4];
		Le = ucCommand_APDU[4 + Lc + 1];
		usLen = 0;
	}
	else
	{
		return;
	}

	sRet = ICCTransmit
		(
			ucReaderHandle,
			ucCardNo,
			ucCommand_APDU[0],
			ucCommand_APDU[1],
			ucCommand_APDU[2],
			ucCommand_APDU[3],
			Lc,
			ucCommand_APDU + 5,
			Le,
			ucResponse_APDU,
			&usLen
		);

	display_ic_status();
	debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
	if (usLen == 0 && CARD_SW1 == 0x61)
	{
		Lc = 0;
		Le = CARD_SW2;
		memset(ucResponse_APDU, 0, sizeof(ucResponse_APDU));
		sRet = ICCTransmit
			(
				ucReaderHandle,
				ucCardNo,
				0x00,
				0xC0,
				0x00,
				0x00,
				Lc,
				ucCommand_APDU + 5,
				Le,
				ucResponse_APDU,
				&usLen
			);
		display_ic_status();
		debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
	}

	return;
}

int test_4428(unsigned char hd_no)
{
	char	out[1024], length, key[256];
	char	tmp_str[100];
	short	ret;
	char	status, err_no;

	ret = power_up_4428(hd_no, &status, &length, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(power_up_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, length);

	if (ICC_in(hd_no) == 0)
	{
		ret = read_SIM4428(hd_no, 0, 20, out);
		if (ret != SUCC)
		{
			display(1, "(read_SIM4428)");
			GetErrorMessage(ret, tmp_str);
			display(2, "%s", tmp_str);
		}

		debug_disps(3, out, 20);
	}
	else
	{
		display(1, "No Card Insert\n");
		return FAIL;
	}

	ret = read_ERR_SIM4428(hd_no, &err_no);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	display(2, "err_no=%d\n", err_no);

	key[0] = (char) 0x67;
	key[1] = (char) 0xC6;
	ret = verify_SIM4428(hd_no, key, &err_no);
	if (err_no != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(verify_4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(2, "err_no=%d\n", err_no);

	ret = read_SIM4428(hd_no, 1021, 500, out);
	if (ret != SUCC)
	{
		display(1, "(read_SIM4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 10);

	memset(out, 0, sizeof(out));
	out[0] = (char) 0x12;
	out[1] = (char) 0x23;
	out[2] = (char) 0x55;
	out[3] = (char) 0xaa;
	ret = write_SIM4428(hd_no, 10, 10, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(write_4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	return SUCC;
}

int test_4442(unsigned char hd_no)
{
	char	out[256], length, key[256];
	char	tmp_str[100];
	short	ret;
	char	status, err_no;

	ret = power_up_4442(hd_no, &status, &length, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(power_up_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, length);

	if (ICC_in(hd_no) == 0)
	{
		ret = read_SIM4442(hd_no, 0, 20, out);
		if (ret != SUCC)
		{
			display(1, "(read_SIM4428)");
			GetErrorMessage(ret, tmp_str);
			display(2, "%s", tmp_str);
		}

		debug_disps(3, out, 20);
	}
	else
	{
		display(1, "No Card Insert\n");
		return FAIL;
	}

	key[0] = (char) 0xB6;
	key[1] = (char) 0x23;
	key[2] = (char) 0x07;
	ret = verify_SIM4442(hd_no, key, &err_no);
	if (err_no != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(verify_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(2, "err_no=%d\n", err_no);

	ret = read_SIM4442(hd_no, 32, 3, out);
	status = CARD_STATUS;
	if (ret != SUCC)
	{
		display(1, "(read_SIM4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 3);

	memset(out, 0, sizeof(out));
	out[0] = (char) 0xab;
	out[1] = (char) 0xcd;
	out[2] = (char) 0xef;
	out[3] = (char) 0xaa;
	ret = write_SIM4442(hd_no, 32, 10, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(write_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	ret = read_SIM4442(hd_no, 32, 3, out);
	if (ret != SUCC)
	{
		display(1, "(read_SIM4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 4);

	return SUCC;
}

int test_cpu_card(unsigned char hd_no)
{
	unsigned char	data[100], len;
	char			card_no = 0, err_str[100];
	short			stat, ret;
	char			tmp_str[100];

	cls();
	displays(1, 1, "\nBegin test CPU card......! \n");

	displays(1, 1, "Insert IC card\n");
	do
	{
		ret = ICC_in(hd_no);
		GetErrorMessage(ret, err_str);
	} while (ret != SUCC);

	stat = power_up(hd_no, card_no, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

/*
	stat = power_down(hd_no, 1);
	stat = power_up(hd_no, 1, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	stat = power_up(hd_no, 2, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	stat = power_up(hd_no, 4, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);
*/
	/*	
	if ( len == 0 ) {
		display_ic_status();
		return FAIL;
	}
*/
	//獲得隨機數
	displays(2, 1, "Begin Get Random...\n");
	stat = outgoing(hd_no, card_no, 0x00, 0x84, 0, 0, 8, data);
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}
	else
	{
		display_ic_status();
		debug_disps(3, (char *) data, 8);
	}

	//選擇文件
	displays(3, 1, "Begin Select File...\n");

	data[0] = 0x3f;
	data[1] = 0x00;
	stat = incoming(hd_no, card_no, 0x00, 0xA4, 0, 0, 2, data);

	//stat = PSAM_Select_File ( hd_no, card_no, 0x3f, 0x00, data) ;
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}
	else
	{
		display_ic_status();
	}

	stat = power_down(hd_no, card_no);
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}

	displays(8, 1, "Press any key to continue\n");
	inkey(0);
	cls();

	return stat;
}

int test_display(unsigned char hd_no)
{
	short			ret;
	unsigned char	key;
	char			tmp_str[100];

	displays(1, 1, "display a line in PINPAD\n");
	display(2, "在PINPAD上從某一行的第一列開始顯示中西文字符,并清掉后面的已有的字符\n");
	ret = display_pad(hd_no, 1, "Test Display");
	if (ret != SUCC)
	{
		display(1, "(display_pad):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(4, "在PINPAD上顯示5*7小點陣ASCII字符, 不清除其它顯示.\n");
	ret = disps_ascii(hd_no, 2, 4, "1234ABCD");
	if (ret != SUCC)
	{
		display(1, "(disps_ascii):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	ret = display_pad(hd_no, 6, "Display顯示第6行");

	ret = pad_sound(hd_no, 500);
	if (ret != SUCC)
	{
		display(1, "(pad_sound):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	displays(5, 1, "push a key in PINPAD......\n");
	while (1)
	{
		get_push_key(hd_no, &key);	//讀入鍵值后,下一次讀入是0
		if (key != 0)
		{
			displays(6, 1, "get push key= %02x\n", key);
			break;
		}
	}

	displays(7, 1, "get kbhit of PinPad: \n");
	while (1)
	{
		kbhit_pad(hd_no, &key);		//kbhit未清緩沖區,下一次讀出還是原值
		if (key != 0)
		{
			displays(8, 1, "kbhit_pad return=%02x\n", key);
			break;
		}
	}

	return SUCC;
}

int test_input_key(unsigned char hd_no)
{
	unsigned char	tmp_str[100], str_len;
	short			sRet = 0;

	memset(tmp_str, 0, sizeof(tmp_str));

	cls();
	displays(1, 1, "INPUT KEY in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT:          ");
		disps_ascii(hd_no, 2, 1, "AMOUNT:123.45   ");
	}
	else
	{
		display_pad(hd_no, 1, "請輸密:");
		display_pad(hd_no, 2, "金額:123.45");
	}

	//sRet = input_str ( hd_no, 1, 0, ASTERISK|VAR_LEN|PINDATA, 6, 1 );
	sRet = input_str(hd_no, 1, 8, VAR_LEN, 19, 1);
	if (sRet == 0)
	{
		do
		{
			sRet = get_str(hd_no, &str_len, tmp_str, 1);
			if (sRet == RCV_TIMEOUT)
			{
				printf("get_str timeout\n");
				return FAIL;
			}
		}while(sRet == BUSY_INPUT);
		displays(2, 1, "key length=%d ", str_len);
		//displays(3, 1, "key=%s\n", tmp_str);
		printf("key=%s\n", tmp_str);
	}

	memset(tmp_str, 0, sizeof(tmp_str));

	displays(4, 1, "INPUT Code in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT CODE:     ");
		disps_ascii(hd_no, 2, 1, "                ");
	}
	else
	{
		display_pad(hd_no, 1, "請輸密碼:");
		display_pad(hd_no, 2, "");
	}

	input_str(hd_no, 2, 1, ASTERISK | VAR_LEN | PINDATA, 6, 0);
	if (sRet != 0)
	{
		return FAIL;
	}

	do
	{
		/*590取消鍵判斷
		  if( kbhit( ) ){
		  if( inkey( 0 ) == CANCEL ){
		  reset_pad( );
		  return( FAIL );
		  }
		  }
		  */
		if (get_str(hd_no, &str_len, tmp_str, 0) == SUCC)
		{
			if (str_len != 6)
			{
				display_pad(hd_no, 1, "請輸入密碼:");
				display_pad(hd_no, 2, "");
				input_str(hd_no, 2, 1, ASTERISK | VAR_LEN, 6, 0);
				continue;
			}
			else
			{
				break;
			}
		}
	} while (1);

	displays(5, 1, "key length=%d ", str_len);
	//displays(6, 1, "key=%s\n", tmp_str);
	printf("key=%s\n", tmp_str);

	sRet = write_user_key(hd_no, "PIN_", "01234567");
	if (sRet != SUCC)
	{
		display(1, "(write_user_key):err");
		inkey(0);
	}

	sRet = X98_from_pad(hd_no, 0, "PIN_", "0000000000000000", tmp_str);

	//_DES("01234567", tmp_str, tmp_str+10);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一级精品视频在线观看宜春院| 国产中文字幕精品| 亚洲另类春色国产| 国产精品高清亚洲| 久久久久久久久免费| 精品成人在线观看| 日韩精品一区二区三区四区| 日韩一级大片在线观看| 日韩欧美一区二区在线视频| 欧美一级欧美三级| 日韩一区二区三区视频| 日韩三级.com| 夜夜爽夜夜爽精品视频| 亚洲免费在线视频一区 二区| 亚洲欧美日韩国产一区二区三区 | 一区二区三区久久久| 亚洲色图一区二区三区| 亚洲人成伊人成综合网小说| 亚洲精品午夜久久久| 亚洲韩国一区二区三区| 天堂一区二区在线免费观看| 美腿丝袜亚洲综合| 国产在线不卡一卡二卡三卡四卡| 国产中文字幕一区| 成人免费高清在线观看| 91麻豆免费观看| 欧美三级乱人伦电影| 日韩三级精品电影久久久| 久久综合狠狠综合| 中文字幕中文字幕在线一区| 91久久国产最好的精华液| 制服丝袜激情欧洲亚洲| 日韩亚洲欧美一区二区三区| 亚洲精品一区二区三区在线观看 | 久久亚洲综合色| 国产清纯白嫩初高生在线观看91 | 一区二区三区久久久| 人妖欧美一区二区| 国产精品1024久久| 一本久道久久综合中文字幕| 制服丝袜激情欧洲亚洲| 久久精品在线观看| 国产成人一级电影| 94色蜜桃网一区二区三区| 欧美欧美欧美欧美| 国产亚洲欧美在线| 亚洲一区中文在线| 国产制服丝袜一区| 欧美在线观看一二区| 精品福利视频一区二区三区| 亚洲欧洲精品成人久久奇米网| 亚洲bt欧美bt精品777| 国产在线看一区| 欧美主播一区二区三区| 久久综合久久综合久久综合| 一区二区三区日韩欧美精品| 韩国女主播成人在线观看| 色综合久久66| 国产午夜精品久久久久久久| 午夜激情久久久| a美女胸又www黄视频久久| 4438x亚洲最大成人网| 一区二区中文字幕在线| 麻豆91在线播放| 在线观看91精品国产入口| 2023国产精品| 天涯成人国产亚洲精品一区av| gogo大胆日本视频一区| 精品国产一区二区三区av性色| 亚洲美女屁股眼交3| 国产乱码精品一区二区三区av| 欧美美女一区二区在线观看| 中文字幕欧美一区| 国产精品99精品久久免费| 欧美精品tushy高清| 日韩伦理av电影| 国产激情91久久精品导航| 555夜色666亚洲国产免| 一区二区三区在线免费视频| 丁香激情综合国产| 日韩美女视频在线| 日韩精品乱码免费| 91精品福利视频| 国产精品国产成人国产三级| 国产在线精品一区在线观看麻豆| 欧美妇女性影城| 99国产精品国产精品久久| 精品久久免费看| 免费一级片91| 正在播放亚洲一区| 亚洲一区二三区| 91电影在线观看| 亚洲精品国产精华液| www.在线欧美| 国产精品午夜电影| 国产xxx精品视频大全| 国产午夜精品在线观看| 国产在线国偷精品产拍免费yy| 欧美一级在线免费| 日本亚洲最大的色成网站www| 欧美色偷偷大香| 亚洲国产精品久久久久秋霞影院| 91久久精品一区二区二区| 一区二区三区在线观看欧美| 色欧美片视频在线观看在线视频| 日韩理论片一区二区| 色综合视频一区二区三区高清| 亚洲国产精品av| 99re这里都是精品| 亚洲图片激情小说| 色久优优欧美色久优优| 一区二区三区在线观看国产| 欧美曰成人黄网| 偷拍与自拍一区| 日韩欧美二区三区| 久久不见久久见免费视频1| 日韩欧美国产综合在线一区二区三区| 蜜桃一区二区三区在线| www激情久久| 成人免费高清在线| 亚洲视频免费观看| 在线观看91视频| 日韩在线卡一卡二| 欧美不卡在线视频| 国产成人免费9x9x人网站视频| 国产精品久久久久久亚洲伦| 久久精品在这里| av影院午夜一区| 亚洲丶国产丶欧美一区二区三区| 555www色欧美视频| 国产在线一区观看| 成人欧美一区二区三区小说| 欧美性大战久久久久久久蜜臀| 日韩制服丝袜先锋影音| 欧美精品一区二区不卡| av在线一区二区三区| 亚洲一区二区黄色| 日韩片之四级片| 99热99精品| 日日夜夜一区二区| 国产亚洲欧美日韩在线一区| 色噜噜狠狠成人中文综合 | 99热精品一区二区| 日韩一区精品视频| 国产三级精品三级在线专区| 色婷婷综合五月| 精品亚洲成a人| 亚洲欧美另类图片小说| 在线播放中文一区| 国产黄色精品网站| 亚洲bt欧美bt精品| 国产三级久久久| 欧美色倩网站大全免费| 国内成人自拍视频| 一级日本不卡的影视| 久久久亚洲精品石原莉奈| 色狠狠桃花综合| 国产一区二区三区四区五区入口| 亚洲欧美一区二区视频| 日韩三级在线观看| 91香蕉视频mp4| 久久丁香综合五月国产三级网站| 亚洲欧洲制服丝袜| 精品国产欧美一区二区| 欧洲亚洲精品在线| 国产成人精品综合在线观看| 亚洲国产精品久久人人爱蜜臀| 中文在线一区二区| 欧美va亚洲va香蕉在线| 日本韩国欧美三级| 国产成人av一区| 免费在线观看精品| 亚洲影院理伦片| 国产精品国产三级国产专播品爱网| 欧美顶级少妇做爰| 色屁屁一区二区| 成人av动漫网站| 国产一区二区在线看| 日韩不卡一二三区| 一区二区日韩av| 国产精品久久国产精麻豆99网站| 精品国产成人系列| 欧美日韩日日夜夜| 色噜噜狠狠一区二区三区果冻| 国产乱人伦偷精品视频不卡| 免费在线成人网| 天堂一区二区在线| 亚洲一区二区精品久久av| 成人免费在线视频| 国产欧美日韩精品a在线观看| 精品日韩一区二区| 欧美一级二级三级蜜桃| 欧美久久免费观看| 欧美亚洲图片小说| 色欧美片视频在线观看在线视频| 国产成人精品三级| 韩国毛片一区二区三区| 麻豆精品精品国产自在97香蕉| 婷婷六月综合亚洲| 三级影片在线观看欧美日韩一区二区|