【乱码】记一次C#调用Java乱码

news2024/11/24 9:15:20

项目是使用 C# 写的,传输数据使用对方给的Java加密解密算法。直接使用C#写算法要研究对方的算法,耗时较长。
因此直接将jar包转成dll进行调用。

前言

   使用IKVM工具将Java生成的Jar包转成dll,使用C#进行调用,可以正常调用,但是遇到中文就会乱码。
以下将从 如何使用 IKVM工具解决乱码 两个方面介绍。


IKVM使用

一、Jar包生成dll

1.1、环境准备

  • IKVM工具下载,最好使用 ikvm-8.1.5717.0 是对应 JDK 1.8的,如果下载的版本低的话,可能会报错。
  • 把IKVM配置到环境变量中
    在这里插入图片描述

1.2、生成jar包

注意命名空间,在C#中会使用到这个空间:cn.hsaf.common.utils.HseEncAndDecUtil
在这里插入图片描述

1.3、生成dll

打开cmd,打开到jar包所在文件夹,使用命令 ikvmc -out:ybEnc.dll(要生成dll的名字) ybEnc.jar(jar包的名字) 即可生成dll。
在这里插入图片描述

1.4、C#中使用

  • 引用生成的dll
  • 需要额外引用ikvm安装包中的一些dll(没有仔细研究引用哪些,按需应用吧。。)
  • 可以直接使用命名空间.方法名 调用方法 如: cn.hsaf.common.utils.HseEncAndDecUtil.HelloWorld 。
    在这里插入图片描述

排查问题

二、解决乱码的几种尝试

2.1 C#中接收的有问题

一开始出现的时候,感觉直接在C#端转一下就行(因为之前在C#中http请求获取第三方返回数据时,尝试过,结果解决了), 比如可能接收的是GBK 或者 UTF-8 等之类的,在C#中调用后返回的字符串使用UTF-8 to ISO之类的,在网上搜了一堆,逐一试了都不好使,有点投机取巧了,而且这样试太盲目了。。

在这里插入图片描述

2.2 Java传过来的有问题

C#端解决不了,换种思路,那么会不会是 Java 中传过来的 字符串 本身就是乱码呢,接着找到三方给的java工程demo,在main 方法里 把入参写死 直接调用方法 使用sout 打印出参在控制台,控制台输出的也是正常的,中文不是乱码,加密串也可以正常解析出来。不过此时也验证了一点:demo是没有问题的,应该demo里的算法跟对方用的是一个东西(因为之前遇到过给的demo都有问题的),入参包括密钥也是对的 。。

在这里插入图片描述
既然demo没问题,那么我是不是可以看看Java端返回的串,是什么编码格式的,在C#端解一下就行了,然后找到了这个方法:

   public static String getEncoding(String str) {
        String encode = "GB2312";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GB2312
                String s = encode;
                return s; //是的话,返回“GB2312“,以下代码同理
            }
        } catch (Exception exception) {
        }
        encode = "ISO-8859-1";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是ISO-8859-1
                String s1 = encode;
                return s1;
            }
        } catch (Exception exception1) {
        }
        encode = "UTF-8";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是UTF-8
                String s2 = encode;
                return s2;
            }
        } catch (Exception exception2) {
        }
        encode = "GBK";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GBK
                String s3 = encode;
                return s3;
            }
        } catch (Exception exception3) {
        }
        return ""; //如果都不是,说明输入的内容不属于常见的编码格式。
    }

通过测试,发现返回的是GB2312,喜出望外,赶紧在C#中以GB2312接收试试,结果还是乱码。。

会不会是搞复杂了,如果我直接把结果返回出去呢,是不是直接返回中文C#那边也会乱码,然后尝试了下,kao,没有乱码(验证了一点 IKVM方式调用 一般情况下是没啥问题的),那是为啥呢,通过方法返回就乱码,直接返回字符串不乱码。

 

2.3 增加日志记录调用过程中哪里出现的乱码

奇了怪了,两边都没有问题,那问题还能出在哪里呢,这时我甚至开始怀疑是不是IKVM有bug转成dll后 不兼容之类的,毕竟这种方式算是 暴力破解算法。然后开始各种找 IKVM的资料,到网上搜,官网上找,都没有找到相关的论坛,灵机一动,从github上找找呢,通过 description readme 等方式找(参照下方的高级搜索) 也未找到相关资料。

in:name JPA stars:>1000 forks:>
in:readme JPA
in:description JPA language:java pushed:>2022-01-01 stars:>1000

到这里基本已经不知道从哪查起了,迷茫了C#,Java,IKVM都堵死了,是不是可以放弃了,已经没啥思路了,要不搞个SpringBoot给C#调用Http请求呢。。。

休息一会后又从头捋了下,再来最后一次尝试,假设IKVM是没有问题的,肯定还是代码的问题,应该是转成dll后有啥不兼容的地方(因为java里也试了下,输出出来是没问题的),想起了平时解决问题的断点法,这种jar生成dll的东西无法调试 但是为了看到代码的走向,可以加日志在认为有问题的代码下面加上日志(java工程写日志的小例子如下)。

    public static void info(String msg) {
        PrintStream outFile = null;
        try {
            //指向日志文件。FileOutputStream中append参数为true时,创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
            outFile = new PrintStream(new FileOutputStream("F:\\src\\log\\log.txt", true));
            //改变输出方向,默认情况我们用System.out.println是会打印到控制台上.但是用了System.setOut,就会打印到你的文件中。参数必须为FileOutputStream类型。并且输入内容更为灵活。
            System.setOut(outFile);
            //日期当前时间
            Date time = new Date();
            //格式化日期
            SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //转换格式
            String strTime = sdfTime.format(time);
            //内容输出到指定文件中
            System.out.println(strTime + ":" + msg);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

认为有问题的地方加上日志写到文件里
在这里插入图片描述
经过测试发现2 的是没有问题的,输出的是正常的没有乱码,然后改成输出2的形式,C#调用,成功返回!!

简要总结下:平时C#接触的较多一些,打算从这个方向突破,结果失败,只好现学了IKVM 方式的调用,IKVM学会后 多了些尝试的方式,最后通过加断点的形式解决。也验证了一点,java直接跑跟C#调用dll 还是有一些区别的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-10接口与抽象类

Java-10接口与抽象类 抽象方法 abstract method机制 这是一个不完整的方法,它只有一个声明,没有方法体 abstract void f();包含抽象方法的类被称为抽象类:如果一个类包含一个或多个抽象方法,则该类必须被定义为抽象类 public…

CEAC 之《企业信息化管理》3

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1综合布线属于系统集成的____________。 A、网络应用系统 B、应用基础平台 C、网络平台 D、…

JavaEE 几种spring注解

使用注解可以更简单的存储Bean对象和读取Bean对象。 存储Bean对象 在使用注解之前&#xff0c;需要做一些前置工作&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"…

01- mysql基础

MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD 1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会…

Dendro Azide-PEG-Dendro Azide,Dendro N3-PEG-Dendro N3,PEG超支化树状叠氮

1、名称 英文&#xff1a;Dendro Azide-PEG-Dendro Azide&#xff0c;Dendro N3-PEG-Dendro N3 中文&#xff1a;聚乙二醇-超支化树状叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG 4、分子量&#xff1a;可定制&#xff0c;Dendro Azide-PEG 20K-Den…

【暴力更换OPPO启动器为其它三方(Nova Launcher in my Case Scenario)】

狠搞更换OPPO启动器为三方&#xff08;Nova&#xff09; 我咋就不知道狮子座也有这么强烈的强迫症呢&#xff1f;&#xff01; 我每次玩儿新手机必须得搞搞应用图标呀壁纸呀啥的&#xff0c;必须得打上你“磊哥”的风格烙印。但是国内的启动器的通病就是用不了三方的app图标包…

针对小程序的漏洞挖掘

0x00 前言 我们对小程序的漏洞挖掘&#xff0c;关注点还是在逻辑漏洞上面&#xff0c;下面将从环境搭建到实例一步步讲解。&#xff08;此篇文章更适合做安服的老哥们看&#xff09; 0x01 环境配置 工具&#xff1a;BurpFiddlerwindows版本微信 注: 你也可以直接用burpwindo…

面试笔试题之Linux部分58题(第一部分)

1、Linux常用的发行版 debian、Fedora、Ubuntu、redhat、centOS 等补充&#xff1a; Fedora&#xff1a;软件新&#xff0c;不稳定 redhat&#xff1a;稳定、收费 centOS&#xff1a;稳定、免费 2、在Linux里面查看指定时间段的日志文件 sed -n‘/起始时间/,/结束时间/p’ 日…

一篇文章入门知识图谱

文章目录知识图谱一、为什么需要知识图谱&#xff1f;什么是知识图谱&#xff1f;——KG的前世今生1、看到的不仅仅是字符串2、知识图谱的前世今生二、语义网络&#xff0c;语义网&#xff0c;链接数据和知识图谱1、语义网络&#xff08;Semantic Network&#xff09;2、语义网…

Python编程 元组中不允许的操作

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.元组知识点 1.元组中不允许的操作(熟悉) 2.元组与列表之间的转换(掌握…

echarts5.0引入地图,背景渐变色,航线图,地图阴影

效果图如下&#xff0c;文章末尾附全部代码&#xff1a; 参考&#xff1a; 1、航线图 Vue Echarts飞机航线图_Kinghiee的博客-CSDN博客 2、地图阴影 echarts中国地图实现阴影效果&自定义设置_K.P的博客-CSDN博客 版本&#xff1a; "echarts": "^5.1.2&q…

面向OLAP的列式存储DBMS-9-[ClickHouse]的常用日期时间操作

ClickHouse 日期时间的相关操作函数 1 日期时间操作函数 1.1 toDate和toDateTime toDate、toDateTime&#xff1a;将字符串转成 Date、DateTime 一、传入字符串 SELECT toDate(2020-11-11 12:12:12) v1, toDateTime(2020-11-11 12:12:12) v2; /* ┌─────────v1─…

内聚力模型

背景介绍 材料中不可避免的具有各种缺陷&#xff0c;引起工程中结构断裂的发生。针对裂纹扩展相关问题&#xff0c;研究学者基于线弹性断裂力学&#xff0c;通过理论或数值手段得到裂纹尖端的应力强度因子KI、KII 和 KIII 以及应变能释放率GI、GII 和 GIII&#xff0c;对裂纹的…

C++入门(1)

一、关键字 C语言中只有32个关键字&#xff0c;C有63个关键字&#xff0c;将近翻了一倍。 二、命名空间 在编写代码的时候&#xff0c;会遇到定义的变量名和库中的函数名重复&#xff0c;出现命名冲突的情况。在C中有变量名、函数名还有类名&#xff0c;这些都会存在全局域…

两种方式实现websocket获取数据库查询进度

两种方式实现websocket获取数据库查询进度 本文实现了两种方式用websocket连接实现前端通过API获取数据库查询进度&#xff0c;作为websocket初步学习的参考 内容目录概要&#xff1a; 使用额外接口获取指定数据库查询进度&#xff0c;查询进度的接口与获取数据的接口分开实…

SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)

本篇主要介绍凭证相关的配置&#xff0c;希望对学习SAP财务的同学有帮助。 1、定义凭证类型 概念功能说明&#xff1a; • 凭证类型是区分不同交易类型的方法并决定能够被过帐的会计形式。 例如&#xff0c; 可将所有的会计凭证按业务类分成&#xff1a; 总帐凭证、收款…

基础选择器

一、任务目标 掌握基础选择器的应用 二、任务背景 CSS&#xff08;层叠样式表&#xff09;选择器是CSS规则的一部分&#xff0c;用来指定需要设置样式的HTML元素。通过选择器可以实现CSS对HTML元素的一对一、一对多、多对一的控制。 三、任务内容 选择器类型 描述 示例 通配选…

概率论基础

一、条件概率的三大公式 条件概率中的条件就代表观测变量&#xff0c;观测变量意思就是这个变量的取值是否已经定下来了 1.乘法公式 2.全概率公式 随机现象&#xff1a;在一定的条件下&#xff0c;并不总出现相同结果的现象称为随机现象。随机现象的各种结果会表现出一定的…

分类效果评价(机器学习)

目录 准确率 精确率(precision) 召回率(recall&#xff0c;也称为查全率) 调回平均 对于一般分类问题&#xff0c;有训练误差、泛化误差、准确率、错误率等指标 对于常见的二分类问题&#xff0c;样本只有两种分类结果&#xff0c;将其定义为正例与反例。 那么在进行分类…

基于java大学生就业信息管理系统

随着高校教育体制的改革大学生人数的不断增加&#xff0c;毕业生就业制度发生了根本的变化。单位和学生走向人才市场&#xff0c;双向选择&#xff0c;择优录用。因此在这样的情况下&#xff0c;在INTERNET上开发并运行信息管理系统就能够极大地提高工作效率&#xff0c;弥补了…