汉字转GB2312 -(字节累加和 - 按位取反) + 1 获取效验值

这几天应公司的要求要在一个Android设备终端上链接LED显示屏,显示的内容需要不定时的更新。然后今天拿到条屏的发送协议,协议里在发送数据的格式上有几条之前没做过的处理,现在把数据处理的代码写出来了,在这里记录一下。

例子 : #&002200229001考试中注意安全a40a0d

在这里我要获取的是“a4” 这个效验

首先是将字符串转成 16进制的GB2312编码 :

{
    // 这里是调用
    String string = edit_text.getText().toString();
    byte[] b = string.getBytes("GB2312");
    String hexStr =  bytesToHexFun1(b);
}


//将byte数组转成16进制字符串
    public static String bytesToHexFun1(byte[] bytes) {
        char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        // 一个byte为8位,可用两个十六进制位标识
        char[] buf = new char[bytes.length * 2];
        int a = 0;
        int index = 0;
        for(byte b : bytes) { // 使用除与取余进行转换
            if(b < 0) {
                a = 256 + b;
            } else {
                a = b;
            }
            buf[index++] = HEX_CHAR[a / 16];
            buf[index++] = HEX_CHAR[a % 16];
        }
        return new String(buf);
    }

然后将得到的 hexStr 再去累加效验并取反:

我这里用的是两位校验,可以根据自己的需求更改

/**
     * 累加和校验,并取反
     */
    public static String makeCheckSum(String data) {
        if (data == null || data.equals("")) {
            return "";
        }
        int total = 0;
        int len = data.length();
        int num = 0;
        while (num < len) {
            String s = data.substring(num, num + 2);
            System.out.println(s);
            total += Integer.parseInt(s, 16);
            num = num + 2;
        }

        //用256求余最大是255,即16进制的FF
        int mod = total % 256;
        if (mod == 0) {
            return "FF";
        } else {
            String hex = Integer.toHexString(mod).toUpperCase();

            hex = parseHex2Opposite(hex);
            return hex;
        }
    }

    /**
     * 取反
     */
    public static String parseHex2Opposite(String str) {
        String hex;
        //十六进制转成二进制
        byte[] er = parseHexStr2Byte(str);

        //取反
        byte erBefore[] = new byte[er.length];
        for (int i = 0; i < er.length; i++) {
            erBefore[i] = (byte) ~er[i];
        }
        //二进制转成十六进制
        hex = parseByte2HexStr(erBefore);
        // 如果不够校验位的长度,补0,这里用的是两位校验
        hex = (hex.length() < 2 ? "0" + hex : hex);
        return hex;
    }

    /**
     * 将十六进制转换为二进制
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    /**
     * 将二进制转换成十六进制
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

最后累加取反后 得到一个String take ,这个take 是16进制的 在将他加一:

String and = Integer.toHexString((Integer.valueOf(take, 16) + 1));

这就得到“a4” 了 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GB2312和UTF-8是两种不同的字符编码标准,它们在字符编码方式、字符集大小、字节数等方面都存在差异。因此,要将GB2312编码的字符串换为UTF-8编码的字符串,需要进行编码换。 在C语言中,可以使用iconv库来进行字符集换。iconv库是一个系统库,可以实现不同编码之间的换。在使用iconv库之前,需要先启用头文件#include <iconv.h>。 下面是一个示例程序,用于将GB2312编码的字符串换为UTF-8编码的字符串: ``` #include <stdio.h> #include <iconv.h> #include <stdlib.h> #include <string.h> int main() { char *gb2312_str = "hello world!"; size_t gb2312_len = strlen(gb2312_str); size_t utf8_len = gb2312_len * 3; // UTF-8最多可能会占用3个字节 char *utf8_str = (char *)malloc(utf8_len); // 分配空间 // 初始化iconv_t iconv_t cd = iconv_open("UTF-8", "GB2312"); if (cd == (iconv_t)-1) { printf("初始化iconv_t失败!\n"); exit(1); } // 进行换 char *inbuf = gb2312_str; char *outbuf = utf8_str; size_t inlen = gb2312_len; size_t outlen = utf8_len; size_t ret = iconv(cd, &inbuf, &inlen, &outbuf, &outlen); if (ret == (size_t)-1) { printf("换失败!\n"); exit(1); } // 输出UTF-8编码的字符串 printf("UTF-8编码的字符串:%s\n", utf8_str); // 关闭iconv_t iconv_close(cd); free(utf8_str); // 释放空间 return 0; } ``` 在上面的示例程序中,我们使用iconv_t类型表示换句柄,使用iconv_open()函数来初始化换句柄。在进行换时,使用iconv()函数将GB2312编码的字符串换为UTF-8编码的字符串,并将结果保存在utf8_str中。 最后,使用iconv_close()函数关闭换句柄,并使用free()函数释放分配的内存空间。 当然,对于实际应用场景,可能还需要进行一些优化和错误处理,例如对输入字符串进行判断、对输出字符串进行截断等等。 ### 回答2: 将GB2312编码换为UTF-8编码是一种编码换的过程,可以使用C语言对字符串进行换实现。具体操作可以如下: 首先需要了解一些基本知识。GB2312编码是双字节编码,每个汉字用两个字节表示;而UTF-8编码是一种变长编码,每个字符根据不同范围的Unicode码用1~4个字节表示。 1. 将GB2312编码的字符串换为Unicode码。可以使用WideCharToMultiByte()函数将GB2312编码换为Unicode码,以便进一步处理。 2. 将Unicode码换为UTF-8编码。可以使用WideCharToMultiByte()函数,设置输出编码格式为UTF-8,即可将Unicode码换为UTF-8编码。 3. 将UTF-8编码的字符串打印输出。可以使用puts()或printf()函数将字符串输出到屏幕上,确认换结果是否正确。 需要注意的是,换过程中可能会出现一些细节问题,如代码页的不同,换后的字符串长度的变化等。因此,最好在进行换时,考虑到这些细节问题,避免出现换错误。 ### 回答3: GB2312和UTF-8都是Unicode编码的变体,但是它们之间是有区别的。GB2312是早期的中文编码,使用双字节表示每个字符,而UTF-8则是一种比较新的编码格式,也是使用变长的字节表示字符,可以表示全球范围内的字符。 在C语言中,我们可以使用iconv函数来进行编码换。iconv函数的原型如下: ``` #include <iconv.h> size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); ``` 其中,参数cd是一个iconv_t类型的换描述符,如果cd等于(iconv_t) -1,则表示换失败;参数inbuf指向被换的字符串;参数inbytesleft表示输入的长度,并被函数用于记录换后余下的需要换的字节数;参数outbuf指向输出缓冲区,参数outbytesleft表示输出缓冲区的大小并记录换后余下的缓冲区大小。 我们可以通过下面的代码将GB2312字符串换为UTF-8字符串。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <errno.h> int main() { char *src = "你好,世界!"; size_t srclen = strlen(src); size_t dstlen = srclen * 2; char *dst = (char *)malloc(dstlen); memset(dst,0,dstlen); iconv_t cd = iconv_open("UTF-8","GB2312"); if (cd == (iconv_t) -1){ perror("iconv_open"); exit(EXIT_FAILURE); } char *inbuf = src; char *outbuf = dst; if (iconv(cd, (char **)&inbuf, &srclen, &outbuf, &dstlen ) == -1) { perror("iconv"); exit(EXIT_FAILURE); } printf("GB2312: %s\n",src); printf("UTF-8: %s\n",dst); iconv_close(cd); free(dst); return 0; } ``` 在这个例子中,我们首先定义了一个需要换的GB2312字符串,在使用iconv_open函数创建一个iconv_t类型的换描述符时,我们指定了源编码是GB2312,目标编码是UTF-8。然后,我们再定义一个输出缓冲区,使用iconv函数将GB2312字符串换为UTF-8字符串。 最后,我们通过printf函数按照不同的编码格式输出了换后的字符串。需要注意的是,这个例子中的代码并没有对错误进行完整的处理,因此在实际应用时需要注意添加错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值