法人和其他组织统一社会信用代码编码规则,附有源代码

第18位校验码生成标准

链接如下:

http://qyj.saic.gov.cn/wjfb/201509/t20150929_162430.html


第17位效验码生成文档
链接如下:
http://www.doc88.com/p-334768906907.html

代码算法如下:传递一个16位的字符串即可:
 
    
  1. import java.util.LinkedHashMap;
  2. import java.util.Map;
  3. import java.util.Map.Entry;
  4. /**
  5. *
  6. * @author Alan
  7. * 2016年10月12日 下午5:05:52
  8. * 注释:校验码生成工具类
  9. */
  10. public class ValidCodeUtil {
  11. /**
  12. * 获取校验码
  13. * @param str 16位字符串
  14. * @return 18位校验码
  15. */
  16. public static String getValidCode(String str){
  17. if(str.length() == 16){
  18. //1.通过传递过来的16位字符串获取第17位编码
  19. String string = str.substring(8, str.length());
  20. String num17 = getNum17(string);
  21. str += num17;
  22. //2.通过上面的17位字符串算出第18位编码
  23. String num18 = getNum18(str);
  24. str += num18;
  25. }
  26. return str;
  27. }
  28. /**
  29. * 获取第17位字符
  30. * @param str 16位长度的字符串
  31. * @return 第17位字符
  32. */
  33. private static String getNum17(String str){
  34. int[] w = {3,7,9,10,5,8,4,2};//8位加权因子数组 , 传递进来的字符串参数为8位 , 从0到7分别代表一个整型值
  35. //该集合存放熊0-9,A-Z所对应的整型值
  36. Map<String, Integer> machineNumMap = new LinkedHashMap<>();
  37. for(int i = 0 ; i < 10 ; i++){
  38. machineNumMap.put(String.valueOf(i), i);
  39. }
  40. String ascii = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  41. char[] bigWord = ascii.toCharArray();
  42. int num = 10;
  43. for(char c : bigWord){
  44. machineNumMap.put(String.valueOf(c), num++);
  45. }
  46. //算法开始计算 , 获取总和
  47. char[] charArray = str.toCharArray();
  48. int sum = 0;
  49. for(int i = 0 ; i < charArray.length ; i++){
  50. sum += w[i] * machineNumMap.get(String.valueOf(charArray[i]));
  51. }
  52. //当总和除以11余数为1时第9位校验码为X , 余数为0是校验码为0
  53. int nine = sum % 11;
  54. String nineStr = "";
  55. if(nine == 1){
  56. nineStr = "X";
  57. }else if(nine == 0){
  58. nineStr = "0";
  59. }else{
  60. nineStr = String.valueOf(11-nine);
  61. }
  62. return nineStr;
  63. }
  64. /**
  65. * 获取第18位字符
  66. * @param str 17位长度的字符串
  67. * @return 第18位字符
  68. */
  69. private static String getNum18(String str) {
  70. int[] w = {1,2,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28};//17位加权因子数组 , 传递进来的字符串参数为17位 , 从0到16分别代表一个整型值
  71. // 该集合存放熊0-9,A-Z所对应的整型值
  72. Map<String, Integer> machineNumMap = new LinkedHashMap<>();
  73. for (int i = 0; i < 10; i++) {
  74. machineNumMap.put(String.valueOf(i), i);
  75. }
  76. String ascii = "ABCDEFGHJKLMNPQRTUWXY";//没有IOZSV
  77. char[] bigWord = ascii.toCharArray();
  78. int num = 10;
  79. for (char c : bigWord) {
  80. machineNumMap.put(String.valueOf(c), num++);
  81. }
  82. // 算法开始计算 , 获取总和
  83. char[] charArray = str.toCharArray();
  84. int sum = 0;
  85. for (int i = 0; i < charArray.length; i++) {
  86. sum += w[i] * machineNumMap.get(String.valueOf(charArray[i]));
  87. }
  88. //当总和除以31余数为1时第9位校验码为Y , 余数为0是校验码为0
  89. int eightteen = sum % 31;
  90. String eighteenStr = "";
  91. if(eightteen == 1){
  92. eighteenStr = "Y";
  93. }else if(eightteen == 0){
  94. eighteenStr = "0";
  95. }else{
  96. for (Entry<String, Integer> entry : machineNumMap.entrySet()) {
  97. if(entry.getValue() == 31-eightteen-1){
  98. eighteenStr = entry.getKey();
  99. }
  100. }
  101. }
  102. return eighteenStr;
  103. }
  104. }

你可能感兴趣的:(JavaSE)