逆向爬虫33 Java基础一
目的
- 总结java和之前学过语言之间相似和不同的地方,方便记忆
基本特性
- 一个文件可以有多个类,但只能有一个public类,且public类名必须和文件名相同
- 类名首字母大写且驼峰式命名,例如:Hello、UserInfo、PersonApplication
- 类中的方法分为成员方法和静态方法,成员方法必须通过实例化类的对象来调用,静态方法可以直接通过类名来调用
- java中方法的参数和返回值都必须指定数据类型,返回值为空时为void
- java基本输入输出
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String text = input.nextLine();
System.out.println(text);
input.close();
}
}
- 变量定义和C/C++一样,但是定义常量的修饰符为 final
- 条件 if … else … 循环 while,do while,for 和C/C++一样
整型 ( 特别是字节类型 )
- java中的整型分为:byte,short,int,long四种类型,分别是1个,2个,4个和8个字节大小
- byte类型和C/C++中的char类型相似,可以用byte数组来和字符串做相互转换
import java.util.Arrays;
public class Hello {
public static void main(String[] args) {
// 字节数组 -> 字符串
byte[] dataList = {97, 105, 100, 61, 50, 52, 54, 51, 56, 55, 53, 55, 49, 38, 97, 117, 116, 111, 95, 112, 108, 97, 121, 61, 48, 38, 99, 105, 100, 61, 50, 56, 57, 48, 48, 56, 52, 52, 49, 38, 100, 105, 100, 61, 75, 82, 69, 104, 69, 83, 77, 85, 74, 104, 56, 116, 70, 67, 69, 86, 97, 82, 86, 112, 69, 50, 116, 97, 80, 81, 107, 55, 87, 67, 104, 67, 74, 103, 38, 101, 112, 105, 100, 61, 48, 38, 102, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 48, 57, 51, 55, 38, 108, 118, 61, 48, 38, 109, 105, 100, 61, 48, 38, 112, 97, 114, 116, 61, 49, 38, 115, 105, 100, 61, 48, 38, 115, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 52, 51, 55, 50, 38, 115, 117, 98, 95, 116, 121, 112, 101, 61, 48, 38, 116, 121, 112, 101, 61, 51};
String dataString = new String(dataList);
System.out.println(dataString);
// 字符串 -> 字节数组
try {
// python中的 name.encode("gbk")
String name = "一个小黑";
byte[] v1 = name.getBytes("GBK");
System.out.println(Arrays.toString(v1));
// python中的 name.encode("utf-8")
byte[] v2 = name.getBytes("utf-8");
System.out.println(Arrays.toString(v2));
} catch (Exception e) {
}
}
}
- byte类型数组可以直接通过String构造函数转换成字符串
- String字符串可以通过getBytes(charset)方法转换成byte数组
- 上述例子就是从字符串转换为字节数组,下一步需要去看v0是什么编码
java字节转换为python字节
注意:python中的字节是无符号数,范围是0255,java中的字节是有符号数,范围是-128127,其中正数是一一对应的
java中的字节,有符号:-128 ~ 127
0 1 2 3 ... 126 127 -128 -127 ... -3 -2 -1
python中的字节,无符号数:0 ~ 255
0 1 2 3 ... 126 127 128 129 ... 253 254 255
因此以后碰到java中的byte字节类型需要用python来模拟的话,需要做相应的处理,处理的方法如下
# Python脚本,方便你们以后使用。
byte_list = [-50, -28, -59, -26, -58, -21]
bs = bytearray() # python字节数组
for item in byte_list:
if item < 0:
item = item + 256
bs.append(item)
str_data = bs.decode('gbk') # data = bytes(bs)
print(str_data) # 武沛齐
字符串
- 字符串的定义方式有以下几种
import java.io.UnsupportedEncodingException;
public class Hello {
public static void main(String[] args) throws UnsupportedEncodingException {
String v1 = "一个小黑";
String v2 = new String("一个小黑");
String v3 = new String(new byte[]{-28, -72, -128, -28, -72, -86, -27, -80, -113, -23, -69, -111});
String v4 = new String(new byte[]{-46, -69, -72, -10, -48, -95, -70, -38}, "GBK");
String v5 = new String(new char[]{'一', '个', '小', '黑'});
}
}
- 字符串中的方法基本和python中的一样,看到方法名字就知道是干什么用的了
- java中比较两个字符串是否相同是通过equals()方法实现的,而python中只需要用 == 运算符就可以了
字符串拼接 ( StringBuilder )
- java中的连接字符串是通过StringBuilder实现的
public class Hello {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("name");
sb.append("=");
sb.append("apphao");
sb.append("&");
sb.append("age");
sb.append("=");
sb.append("18");
String dataString = sb.toString();
System.out.println(dataString); // name=apphao&age=18
}
}
以后在逆向的过程中看到StringBuilder就知道要连接字符串了
数组
- java中的数组和C/C++中的数组类似,只能存放指定个数,固定类型变量,单写法上稍有不同
import java.util.Arrays;
public class Hello {
public static void main(String[] args) {
int[] numArray = new int[3]; // 整型数组
numArray[0] = 123;
numArray[1] = 1;
numArray[2] = 99;
System.out.println(Arrays.toString(numArray));
String[] names = new String[]{"一个小黑", "alex", "eric"}; // 字符串数组
System.out.println(Arrays.toString(names));
String[] nameArray = {"一个小黑", "alex", "eric"};
System.out.println(Arrays.toString(nameArray));
for (int idx = 0; idx < nameArray.length; idx++) {
System.out.println(nameArray[idx]);
}
}
}
Object
java中的object可以泛指任何一种类型的变量,和python中的object类似
public class Hello {
public static void func(Object v1) {
if (v1 instanceof Integer) {
System.out.println("整型");
} else if (v1 instanceof String) {
System.out.println("字符串类型");
} else {
System.out.println("位置类型");
}
}
public static void main(String[] args) {
func(123);
func("123");
func(12.3);
}
}
- Java中所有的类都继承Object,Object代指所有的类型。
- 自己创建关系
ArrayList v1 = new ArrayList();
LinkedList v2 = new LinkedList();
List v1 = new ArrayList();
List v2 = new LinkedList();
Object v1 = new ArrayList();
Object v2 = new LinkedList();