2019独角兽企业重金招聘Python工程师标准>>>

  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import org.apache.commons.lang.StringUtils;
  8. /**
  9. * 身份证工具类
  10. *
  11. * @author June
  12. * @version 1.0, 2010-06-17
  13. */
  14. public class IdcardUtils extends StringUtils {
  15. /** 中国公民身份证号码最小长度。 */
  16. public static final int CHINA_ID_MIN_LENGTH = 15;
  17. /** 中国公民身份证号码最大长度。 */
  18. public static final int CHINA_ID_MAX_LENGTH = 18;
  19. /** 省、直辖市代码表 */
  20. public static final String cityCode[] = {
  21. "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",
  22. "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71",
  23. "81", "82", "91"
  24. };
  25. /** 每位加权因子 */
  26. public static final int power[] = {
  27. 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
  28. };
  29. /** 第18位校检码 */
  30. public static final String verifyCode[] = {
  31. "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
  32. };
  33. /** 最低年限 */
  34. public static final int MIN = 1930;
  35. public static Map<String, String> cityCodes = new HashMap<String, String>();
  36. /** 台湾身份首字母对应数字 */
  37. public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();
  38. /** 香港身份首字母对应数字 */
  39. public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();
  40. static {
  41. cityCodes.put("11", "北京");
  42. cityCodes.put("12", "天津");
  43. cityCodes.put("13", "河北");
  44. cityCodes.put("14", "山西");
  45. cityCodes.put("15", "内蒙古");
  46. cityCodes.put("21", "辽宁");
  47. cityCodes.put("22", "吉林");
  48. cityCodes.put("23", "黑龙江");
  49. cityCodes.put("31", "上海");
  50. cityCodes.put("32", "江苏");
  51. cityCodes.put("33", "浙江");
  52. cityCodes.put("34", "安徽");
  53. cityCodes.put("35", "福建");
  54. cityCodes.put("36", "江西");
  55. cityCodes.put("37", "山东");
  56. cityCodes.put("41", "河南");
  57. cityCodes.put("42", "湖北");
  58. cityCodes.put("43", "湖南");
  59. cityCodes.put("44", "广东");
  60. cityCodes.put("45", "广西");
  61. cityCodes.put("46", "海南");
  62. cityCodes.put("50", "重庆");
  63. cityCodes.put("51", "四川");
  64. cityCodes.put("52", "贵州");
  65. cityCodes.put("53", "云南");
  66. cityCodes.put("54", "西藏");
  67. cityCodes.put("61", "陕西");
  68. cityCodes.put("62", "甘肃");
  69. cityCodes.put("63", "青海");
  70. cityCodes.put("64", "宁夏");
  71. cityCodes.put("65", "新疆");
  72. cityCodes.put("71", "台湾");
  73. cityCodes.put("81", "香港");
  74. cityCodes.put("82", "澳门");
  75. cityCodes.put("91", "国外");
  76. twFirstCode.put("A", 10);
  77. twFirstCode.put("B", 11);
  78. twFirstCode.put("C", 12);
  79. twFirstCode.put("D", 13);
  80. twFirstCode.put("E", 14);
  81. twFirstCode.put("F", 15);
  82. twFirstCode.put("G", 16);
  83. twFirstCode.put("H", 17);
  84. twFirstCode.put("J", 18);
  85. twFirstCode.put("K", 19);
  86. twFirstCode.put("L", 20);
  87. twFirstCode.put("M", 21);
  88. twFirstCode.put("N", 22);
  89. twFirstCode.put("P", 23);
  90. twFirstCode.put("Q", 24);
  91. twFirstCode.put("R", 25);
  92. twFirstCode.put("S", 26);
  93. twFirstCode.put("T", 27);
  94. twFirstCode.put("U", 28);
  95. twFirstCode.put("V", 29);
  96. twFirstCode.put("X", 30);
  97. twFirstCode.put("Y", 31);
  98. twFirstCode.put("W", 32);
  99. twFirstCode.put("Z", 33);
  100. twFirstCode.put("I", 34);
  101. twFirstCode.put("O", 35);
  102. hkFirstCode.put("A", 1);
  103. hkFirstCode.put("B", 2);
  104. hkFirstCode.put("C", 3);
  105. hkFirstCode.put("R", 18);
  106. hkFirstCode.put("U", 21);
  107. hkFirstCode.put("Z", 26);
  108. hkFirstCode.put("X", 24);
  109. hkFirstCode.put("W", 23);
  110. hkFirstCode.put("O", 15);
  111. hkFirstCode.put("N", 14);
  112. }
  113. /**
  114. * 将15位身份证号码转换为18位
  115. *
  116. * @param idCard
  117. *            15位身份编码
  118. * @return 18位身份编码
  119. */
  120. public static String conver15CardTo18(String idCard) {
  121. String idCard18 = "";
  122. if (idCard.length() != CHINA_ID_MIN_LENGTH) {
  123. return null;
  124. }
  125. if (isNum(idCard)) {
  126. // 获取出生年月日
  127. String birthday = idCard.substring(6, 12);
  128. Date birthDate = null;
  129. try {
  130. birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);
  131. } catch (ParseException e) {
  132. e.printStackTrace();
  133. }
  134. Calendar cal = Calendar.getInstance();
  135. if (birthDate != null)
  136. cal.setTime(birthDate);
  137. // 获取出生年(完全表现形式,如:2010)
  138. String sYear = String.valueOf(cal.get(Calendar.YEAR));
  139. idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);
  140. // 转换字符数组
  141. char[] cArr = idCard18.toCharArray();
  142. if (cArr != null) {
  143. int[] iCard = converCharToInt(cArr);
  144. int iSum17 = getPowerSum(iCard);
  145. // 获取校验位
  146. String sVal = getCheckCode18(iSum17);
  147. if (sVal.length() > 0) {
  148. idCard18 += sVal;
  149. } else {
  150. return null;
  151. }
  152. }
  153. } else {
  154. return null;
  155. }
  156. return idCard18;
  157. }
  158. /**
  159. * 验证身份证是否合法
  160. */
  161. public static boolean validateCard(String idCard) {
  162. String card = idCard.trim();
  163. if (validateIdCard18(card)) {
  164. return true;
  165. }
  166. if (validateIdCard15(card)) {
  167. return true;
  168. }
  169. String[] cardval = validateIdCard10(card);
  170. if (cardval != null) {
  171. if (cardval[2].equals("true")) {
  172. return true;
  173. }
  174. }
  175. return false;
  176. }
  177. /**
  178. * 验证18位身份编码是否合法
  179. *
  180. * @param idCard 身份编码
  181. * @return 是否合法
  182. */
  183. public static boolean validateIdCard18(String idCard) {
  184. boolean bTrue = false;
  185. if (idCard.length() == CHINA_ID_MAX_LENGTH) {
  186. // 前17位
  187. String code17 = idCard.substring(0, 17);
  188. // 第18位
  189. String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);
  190. if (isNum(code17)) {
  191. char[] cArr = code17.toCharArray();
  192. if (cArr != null) {
  193. int[] iCard = converCharToInt(cArr);
  194. int iSum17 = getPowerSum(iCard);
  195. // 获取校验位
  196. String val = getCheckCode18(iSum17);
  197. if (val.length() > 0) {
  198. if (val.equalsIgnoreCase(code18)) {
  199. bTrue = true;
  200. }
  201. }
  202. }
  203. }
  204. }
  205. return bTrue;
  206. }
  207. /**
  208. * 验证15位身份编码是否合法
  209. *
  210. * @param idCard
  211. *            身份编码
  212. * @return 是否合法
  213. */
  214. public static boolean validateIdCard15(String idCard) {
  215. if (idCard.length() != CHINA_ID_MIN_LENGTH) {
  216. return false;
  217. }
  218. if (isNum(idCard)) {
  219. String proCode = idCard.substring(0, 2);
  220. if (cityCodes.get(proCode) == null) {
  221. return false;
  222. }
  223. String birthCode = idCard.substring(6, 12);
  224. Date birthDate = null;
  225. try {
  226. birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));
  227. } catch (ParseException e) {
  228. e.printStackTrace();
  229. }
  230. Calendar cal = Calendar.getInstance();
  231. if (birthDate != null)
  232. cal.setTime(birthDate);
  233. if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)),
  234. Integer.valueOf(birthCode.substring(4, 6)))) {
  235. return false;
  236. }
  237. } else {
  238. return false;
  239. }
  240. return true;
  241. }
  242. /**
  243. * 验证10位身份编码是否合法
  244. *
  245. * @param idCard 身份编码
  246. * @return 身份证信息数组
  247. *         <p>
  248. *         [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false)
  249. *         若不是身份证件号码则返回null
  250. *         </p>
  251. */
  252. public static String[] validateIdCard10(String idCard) {
  253. String[] info = new String[3];
  254. String card = idCard.replaceAll("[\\(|\\)]", "");
  255. if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {
  256. return null;
  257. }
  258. if (idCard.matches("^[a-zA-Z][0-9]{9}{1}quot;)) { // 台湾
  259. info[0] = "台湾";
  260. System.out.println("11111");
  261. String char2 = idCard.substring(1, 2);
  262. if (char2.equals("1")) {
  263. info[1] = "M";
  264. System.out.println("MMMMMMM");
  265. } else if (char2.equals("2")) {
  266. info[1] = "F";
  267. System.out.println("FFFFFFF");
  268. } else {
  269. info[1] = "N";
  270. info[2] = "false";
  271. System.out.println("NNNN");
  272. return info;
  273. }
  274. info[2] = validateTWCard(idCard) ? "true" : "false";
  275. } else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?{1}quot;)) { // 澳门
  276. info[0] = "澳门";
  277. info[1] = "N";
  278. // TODO
  279. } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?{1}quot;)) { // 香港
  280. info[0] = "香港";
  281. info[1] = "N";
  282. info[2] = validateHKCard(idCard) ? "true" : "false";
  283. } else {
  284. return null;
  285. }
  286. return info;
  287. }
  288. /**
  289. * 验证台湾身份证号码
  290. *
  291. * @param idCard
  292. *            身份证号码
  293. * @return 验证码是否符合
  294. */
  295. public static boolean validateTWCard(String idCard) {
  296. String start = idCard.substring(0, 1);
  297. String mid = idCard.substring(1, 9);
  298. String end = idCard.substring(9, 10);
  299. Integer iStart = twFirstCode.get(start);
  300. Integer sum = iStart / 10 + (iStart % 10) * 9;
  301. char[] chars = mid.toCharArray();
  302. Integer iflag = 8;
  303. for (char c : chars) {
  304. sum = sum + Integer.valueOf(c + "") * iflag;
  305. iflag--;
  306. }
  307. return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;
  308. }
  309. /**
  310. * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
  311. * <p>
  312. * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35
  313. * 最后一位校验码为0-9的数字加上字符"A","A"代表10
  314. * </p>
  315. * <p>
  316. * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
  317. * </p>
  318. *
  319. * @param idCard 身份证号码
  320. * @return 验证码是否符合
  321. */
  322. public static boolean validateHKCard(String idCard) {
  323. String card = idCard.replaceAll("[\\(|\\)]", "");
  324. Integer sum = 0;
  325. if (card.length() == 9) {
  326. sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9
  327. + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;
  328. card = card.substring(1, 9);
  329. } else {
  330. sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;
  331. }
  332. String mid = card.substring(1, 7);
  333. String end = card.substring(7, 8);
  334. char[] chars = mid.toCharArray();
  335. Integer iflag = 7;
  336. for (char c : chars) {
  337. sum = sum + Integer.valueOf(c + "") * iflag;
  338. iflag--;
  339. }
  340. if (end.toUpperCase().equals("A")) {
  341. sum = sum + 10;
  342. } else {
  343. sum = sum + Integer.valueOf(end);
  344. }
  345. return (sum % 11 == 0) ? true : false;
  346. }
  347. /**
  348. * 将字符数组转换成数字数组
  349. *
  350. * @param ca
  351. *            字符数组
  352. * @return 数字数组
  353. */
  354. public static int[] converCharToInt(char[] ca) {
  355. int len = ca.length;
  356. int[] iArr = new int[len];
  357. try {
  358. for (int i = 0; i < len; i++) {
  359. iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
  360. }
  361. } catch (NumberFormatException e) {
  362. e.printStackTrace();
  363. }
  364. return iArr;
  365. }
  366. /**
  367. * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
  368. *
  369. * @param iArr
  370. * @return 身份证编码。
  371. */
  372. public static int getPowerSum(int[] iArr) {
  373. int iSum = 0;
  374. if (power.length == iArr.length) {
  375. for (int i = 0; i < iArr.length; i++) {
  376. for (int j = 0; j < power.length; j++) {
  377. if (i == j) {
  378. iSum = iSum + iArr[i] * power[j];
  379. }
  380. }
  381. }
  382. }
  383. return iSum;
  384. }
  385. /**
  386. * 将power和值与11取模获得余数进行校验码判断
  387. *
  388. * @param iSum
  389. * @return 校验位
  390. */
  391. public static String getCheckCode18(int iSum) {
  392. String sCode = "";
  393. switch (iSum % 11) {
  394. case 10:
  395. sCode = "2";
  396. break;
  397. case 9:
  398. sCode = "3";
  399. break;
  400. case 8:
  401. sCode = "4";
  402. break;
  403. case 7:
  404. sCode = "5";
  405. break;
  406. case 6:
  407. sCode = "6";
  408. break;
  409. case 5:
  410. sCode = "7";
  411. break;
  412. case 4:
  413. sCode = "8";
  414. break;
  415. case 3:
  416. sCode = "9";
  417. break;
  418. case 2:
  419. sCode = "x";
  420. break;
  421. case 1:
  422. sCode = "0";
  423. break;
  424. case 0:
  425. sCode = "1";
  426. break;
  427. }
  428. return sCode;
  429. }
  430. /**
  431. * 根据身份编号获取年龄
  432. *
  433. * @param idCard
  434. *            身份编号
  435. * @return 年龄
  436. */
  437. public static int getAgeByIdCard(String idCard) {
  438. int iAge = 0;
  439. if (idCard.length() == CHINA_ID_MIN_LENGTH) {
  440. idCard = conver15CardTo18(idCard);
  441. }
  442. String year = idCard.substring(6, 10);
  443. Calendar cal = Calendar.getInstance();
  444. int iCurrYear = cal.get(Calendar.YEAR);
  445. iAge = iCurrYear - Integer.valueOf(year);
  446. return iAge;
  447. }
  448. /**
  449. * 根据身份编号获取生日
  450. *
  451. * @param idCard 身份编号
  452. * @return 生日(yyyyMMdd)
  453. */
  454. public static String getBirthByIdCard(String idCard) {
  455. Integer len = idCard.length();
  456. if (len < CHINA_ID_MIN_LENGTH) {
  457. return null;
  458. } else if (len == CHINA_ID_MIN_LENGTH) {
  459. idCard = conver15CardTo18(idCard);
  460. }
  461. return idCard.substring(6, 14);
  462. }
  463. /**
  464. * 根据身份编号获取生日年
  465. *
  466. * @param idCard 身份编号
  467. * @return 生日(yyyy)
  468. */
  469. public static Short getYearByIdCard(String idCard) {
  470. Integer len = idCard.length();
  471. if (len < CHINA_ID_MIN_LENGTH) {
  472. return null;
  473. } else if (len == CHINA_ID_MIN_LENGTH) {
  474. idCard = conver15CardTo18(idCard);
  475. }
  476. return Short.valueOf(idCard.substring(6, 10));
  477. }
  478. /**
  479. * 根据身份编号获取生日月
  480. *
  481. * @param idCard
  482. *            身份编号
  483. * @return 生日(MM)
  484. */
  485. public static Short getMonthByIdCard(String idCard) {
  486. Integer len = idCard.length();
  487. if (len < CHINA_ID_MIN_LENGTH) {
  488. return null;
  489. } else if (len == CHINA_ID_MIN_LENGTH) {
  490. idCard = conver15CardTo18(idCard);
  491. }
  492. return Short.valueOf(idCard.substring(10, 12));
  493. }
  494. /**
  495. * 根据身份编号获取生日天
  496. *
  497. * @param idCard
  498. *            身份编号
  499. * @return 生日(dd)
  500. */
  501. public static Short getDateByIdCard(String idCard) {
  502. Integer len = idCard.length();
  503. if (len < CHINA_ID_MIN_LENGTH) {
  504. return null;
  505. } else if (len == CHINA_ID_MIN_LENGTH) {
  506. idCard = conver15CardTo18(idCard);
  507. }
  508. return Short.valueOf(idCard.substring(12, 14));
  509. }
  510. /**
  511. * 根据身份编号获取性别
  512. *
  513. * @param idCard 身份编号
  514. * @return 性别(M-男,F-女,N-未知)
  515. */
  516. public static String getGenderByIdCard(String idCard) {
  517. String sGender = "N";
  518. if (idCard.length() == CHINA_ID_MIN_LENGTH) {
  519. idCard = conver15CardTo18(idCard);
  520. }
  521. String sCardNum = idCard.substring(16, 17);
  522. if (Integer.parseInt(sCardNum) % 2 != 0) {
  523. sGender = "M";
  524. } else {
  525. sGender = "F";
  526. }
  527. return sGender;
  528. }
  529. /**
  530. * 根据身份编号获取户籍省份
  531. *
  532. * @param idCard 身份编码
  533. * @return 省级编码。
  534. */
  535. public static String getProvinceByIdCard(String idCard) {
  536. int len = idCard.length();
  537. String sProvince = null;
  538. String sProvinNum = "";
  539. if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
  540. sProvinNum = idCard.substring(0, 2);
  541. }
  542. sProvince = cityCodes.get(sProvinNum);
  543. return sProvince;
  544. }
  545. /**
  546. * 数字验证
  547. *
  548. * @param val
  549. * @return 提取的数字。
  550. */
  551. public static boolean isNum(String val) {
  552. return val == null || "".equals(val) ? false : val.matches("^[0-9]*{1}quot;);
  553. }
  554. /**
  555. * 验证小于当前日期 是否有效
  556. *
  557. * @param iYear
  558. *            待验证日期(年)
  559. * @param iMonth
  560. *            待验证日期(月 1-12)
  561. * @param iDate
  562. *            待验证日期(日)
  563. * @return 是否有效
  564. */
  565. public static boolean valiDate(int iYear, int iMonth, int iDate) {
  566. Calendar cal = Calendar.getInstance();
  567. int year = cal.get(Calendar.YEAR);
  568. int datePerMonth;
  569. if (iYear < MIN || iYear >= year) {
  570. return false;
  571. }
  572. if (iMonth < 1 || iMonth > 12) {
  573. return false;
  574. }
  575. switch (iMonth) {
  576. case 4:
  577. case 6:
  578. case 9:
  579. case 11:
  580. datePerMonth = 30;
  581. break;
  582. case 2:
  583. boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0))
  584. && (iYear > MIN && iYear < year);
  585. datePerMonth = dm ? 29 : 28;
  586. break;
  587. default:
  588. datePerMonth = 31;
  589. }
  590. return (iDate >= 1) && (iDate <= datePerMonth);
  591. }
  592. }

转载于:https://my.oschina.net/u/2350108/blog/514260

Java 身份证工具类相关推荐

  1. java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)

    一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...

  2. java身份证工具类,身份证合法性校验,根据身份证获取生日、年龄、性别

    import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; /**  * 身份证号码校验工具 ...

  3. Java 工具类 - 身份证工具类 IDCardUtil

    先来了解一下身份证的组成规则: 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 ...

  4. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  5. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  6. java常用工具类和Hutool常用的工具类整理

    java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...

  7. 身份证工具类-获取性别、年龄、出生日期

    package com.kotei.aptiv.common.core.util;import org.apache.commons.lang3.StringUtils;import java.uti ...

  8. JAVA常用工具类(实用高效)

    JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...

  9. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

最新文章

  1. java中全大写字符_Java 大写字符串中的字符
  2. JavaScript权威指南 - 函数
  3. hive防止数据误删
  4. 女程序员,说多了都是泪!
  5. JSON jquery 与php 入门
  6. 力算未来丨一张图看懂华为“鲲鹏+昇腾”双引擎
  7. 【Hisi系列】之软件平台开发(MPP相关)
  8. 阿里云_数加平台类HQL的那些坑
  9. 深入了解C++用什么软件编程
  10. xshell安装教程
  11. 考CFA证书只通过一级有用吗?
  12. ubuntu 虚拟机复制粘贴文件(文本) windows
  13. 计算机 64虚拟内存设置方法,计算机虚拟内存怎样设置
  14. python怎么全部注释_python全部注释
  15. Jupyter Notebook 自动生成目录(超级实用)
  16. 构建红图注册到蓝图中
  17. 自建服务器和购买云服务器的过程总结
  18. android10开发io接口,Android Things:外设I/O接口-GPIO
  19. 财富宣言_必须阅读:休闲游戏宣言
  20. aec java ios_Java並發編程之原子操作類

热门文章

  1. 双核CPU揭密:英特尔/AMD没有告诉你的五项事实【ZZ】
  2. 比对数组指定列php,指定列的数组
  3. IT培训班到底有没有必要参加?
  4. 命令行参数python sys模块_python教程--sys模块--命令行参数
  5. java foxpro_java解析FoxPro DBF数据文件
  6. 螺旋天线matlab仿真,用AMDS进行螺旋天线仿真
  7. django 给单个文件加log_django配置日志模块
  8. 邀请合作如何表达_共商校院合作,共促产教融合,市卫校这个会议不一般!
  9. C语言学习笔记---嵌套结构体
  10. FreeRTOS+STM32F103串口通信错误解决方法