Android——验证十六进制字符串奇偶性

这两天在忙,串口通信的项目
之前的项目用的是和校验

所以这个项目参考了上个项目的通信验证方法

然后昨天尴尬的事情发生了,获得串口发来的数据之后,
使用方法

	Integer.parseInt(s,16)

一直报错,错误信息如下:

java.lang.NumberFormatException: For input string: “B0000131313661”

我蒙了啊,之前使用没有问题啊,

后来查资料也查不到

自己想吧,突然想到可能是因为 十六进制字符串过长的问题,int有最大长度

int在java中是4个字节也就是8位十六进制数,最大0x7FFFFFFF

23333,我竟然要用integer解析7字节的数字,那不是想多了,int哪有这大容量啊

之前串口通信都是data部分数据3字节就搞定了,难怪之前的没有出错。

哎。另寻他法吧,后来想是不是检测后5位的和校验,试了试可以是可以,问题是没这么做的啊。

今天早晨,突然想到是否可以使用和校验的方式进行校验,于是就来到了今天的主题。

方法如下

	    /**
	     * 计算十六进制字符串的奇偶性
	     *
	     * @param hexString 十六进制字符串
	     * @return 奇 返回1 ;偶 返回0
	     */
	    public static int hexStringCheck(@NonNull String hexString) {
	        // 新建要返回的奇偶值
	        int check_result = 0;
	        // 遍历hexString
	        for (int i = 0; i < hexString.length(); i++) {
	            // 当前字符的奇偶性
	            int current_result = 0;
	            String s = hexString.charAt(i) + "";
		            // 验证当前字符串的奇偶性
		            // 位运算移动  0 1 2 3 如果为1则 current_result++
		            for (int j = 0; j < 4; j++) {
		                if ((Integer.parseInt(s, 16) >>> j & 0x01) == 1) {
		                    current_result++;
		                }
		            }
	            check_result += current_result;
	        }
	        return check_result % 2;
	    }

上面的方法,是使用遍历字符串,每一个字符进行位运算得到其奇偶性

再将每一位的奇偶性相加获得总体字符串的奇偶性

验证如下:

	// 收到16进制字符串
	String s = 'B0000131313661'
	int check_result = hexStringCheck(s)
	log.e('字符串奇偶性为:'+i)

这就完成了

PS:
一定记住,传进去的是16进制字符串,
一定记住,传进去的是16进制字符串,
一定记住,传进去的是16进制字符串,

要不自己添加验证也是可以的。

你可能感兴趣的:(java,android)