下载下来是一堆文件,求验证码文件名成绩和,需要识别验证码,使用编程工具,别的答案都是python版的,来个java版的,代码:

CheckCode.java:

import java.io.File;
import java.io.IOException;

public class CheckCode {
 public static void main(String[] args) throws IOException {
  Ident ident;
  File root = new File("D:\\bmp\\");
     File[] files = root.listFiles();
     long sum=0;
     for(File file:files){
      String name=file.getName().replaceAll(".bmp", "");
      ident=new Ident(file);
      int code=ident.getValidcode(4);
      int a=Integer.parseInt(name);
      sum+=a*code;
     }
     System.out.println(sum);
 }
}

Ident.java

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.*;
import javax.imageio.*;
import javax.imageio.ImageIO;
public class Ident {
 // 数字字符比特表
 private final long[][] NUMERIC = { { 512104545, 562436190 }, // '0'
   { 148931080, 136348222 }, // '1'
   { 511971394, 69273663 }, // '2'
   { 511971406, 17045598 }, // '3'
   { 35168914, 586948743 }, // '4'
   { 1065486398, 17045598 }, // '5'
   { 239208494, 830871646 }, // '6'
   { 1065623684, 69239824 }, // '7'
   { 512104542, 562436190 }, // '8'
   { 512104547, 486805660 } }; // '9'
 // 字框高
 private int intCharHeight = 10;
 // 字框横向间隙
 private int intCharSpaceH = 5;
 // 字框纵向间隙
 private int intCharSpaceY = 1;
 // 字框宽
 private int intCharWidth = 5;
 private int IntImgHeight;
 private BufferedImage img;
 private int intBgColor;
 private int intCharColor;
 private int intImgWith;
 private int intMaxX;
 private int intMaxY;
 private int intMinX;
 private int intMinY;
 // 座标原点
 private Point pOrigin;
 private String strNum;
 public Ident(File file) throws IOException {
  img = ImageIO.read(file);
  init();
 }
 private void init() {
  // 得到图象的长度和宽度
  intImgWith = img.getWidth();
  IntImgHeight = img.getHeight();
  // 得到图象的背景颜色
  intBgColor = img.getRGB(7, 4);
  // System.out.println(intBgColor);
  // 初始化图象原点座标
  pOrigin = new Point(0, 0);
 }
 private void getBaseInfo() {
  System.out.println(intBgColor + "|" + intCharColor);
  System.out.println(intMinX + "|" + intMinY + "|" + intMaxX + "|"
    + intMaxY);
 }
 private Point[] getCharRange(int intNo) {
  // 左上右下点座标
  Point pTopLeft = new Point(0, 0);
  Point pBottomRight = new Point(0, 0);
  // 左上点
  pTopLeft.x = pOrigin.x + intCharWidth * (intNo - 1) + intCharSpaceH
    * (intNo - 1);
  pTopLeft.y = pOrigin.y;
  // 右下点
  pBottomRight.x = 1 + pOrigin.x + intCharWidth * intNo + intCharSpaceH
    * (intNo - 1) - 1;
  pBottomRight.y = pOrigin.y + intCharHeight - 1;
  return new Point[] { pTopLeft, pBottomRight };
 }
 private char getBit(int x, int y) {
  int intCurtColor;
  intCurtColor = img.getRGB(x, y);
  // System.out.println("[" + x + "," + y + "]" + intCurtColor + "==" +
  // intBgColor + "==>" + (Math.abs(intCurtColor) >7308252));
  // return (Math.abs(intCurtColor) >= 5689325)
  // ? '0'
  // : '1';
  return (intCurtColor == intBgColor) ? '0' : '1';
  // 5689325 6008535
 }
 private String getCharString(int intNo) {
  // 本字符的左上右下点座标
  Point[] p = getCharRange(intNo);
  Point pTopLeft = p[0];
  Point pBottomRight = p[1];
  // 换算边界值
  int intX1, intY1, intX2, intY2;
  intX1 = pTopLeft.x;
  intY1 = pTopLeft.y;
  intX2 = pBottomRight.x;
  intY2 = pBottomRight.y;
  // 在边界内循环取象素
  int i, j;
  String strChar = "";
  for (i = intY1; i <= intY2; i++) {
   for (j = intX1; j <= intX2; j++) {
    // System.out.print(getBit(j, i));
    strChar = strChar + getBit(j, i);
   }
   // System.out.println();
  }
  // System.out.println();
  return strChar;
 }
 public int getNum(int intNo) {
  // 取得位字符串
  String strChar = getCharString(intNo);
  // System.out.println(intNo+"=="+strChar);
  // 取得串高位串和低位串
  String strCharHigh = strChar.substring(0, strChar.length() / 2);
  String strCharLow = strChar.substring(strChar.length() / 2);
  // 计算高位和低位值
  long lCharHigh = Long.parseLong(strCharHigh, 2);
  // System.out.println(lCharHigh);
  long lCharLow = Long.parseLong(strCharLow, 2);
  // 在数字中循环比较
  int intNum = '*';
  for (int i = 0; i <= 9; i++) {
   if ((lCharHigh == NUMERIC[i][0]) && (lCharLow == NUMERIC[i][1])) {
    intNum = i;
    break;
   } else {
    if ((lCharHigh == 834533329) && (lCharLow == 242870177)) {
     intNum = 6;
    } // 834533329 242870177
    else {
     intNum = 1;
    } // 默认为1 低位为 937393609 937393601
   }
  }
  return intNum;
 }
 
 public int getValidcode(int length) {
  int num=0;
  for (int i = 1; i <= length; i++) {
   synchronized (this) {
    num=num*10+getNum(i);
   }
  }
  return num;
 }
}

需要导入commons-codec-1.4.jar和commons-logging-1.1.1.jar,请自行下载

Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Flag请点击这里查看索引

查看所有Flag文章需要输入密码,需要获取文章密码的童鞋请扫描下面微信或支付宝二维码捐助至少2元(老哥,捐多捐少是个缘分)之后发送支付凭证号联系我获取,Flag大全地址:Flag大全

新功能:捐款的小伙伴请联系我把自己的注册邮箱加入网站白名单,可以免回复看到本站所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜!

微信二维码:
支付宝二维码: