C#转java需要注意的问题

开发场景:

把圈存机的程序移植到安卓环境(A302多媒体pos机)

----------------------------

传引用

C# 有ref out的方法传引用。

java默认是不支持传引用的,如果一定要传,可以用声明对象的方式,传一个对象,然后在函数内部处理对象跟传引用是类似的。

另外还有一种方式是传byte[] byte数组默认是引用的效果。

例:

传对象

ClassA a = new ClassA();

a.id = 1;

test(a);

String test_a = a.id ; // test_a 为 2

function test(ClassA a){

a.id = 2;

}

传byte[]

byte[] t = new byte[1];

t[0] = 1;

test(t); // 执行完后 t[0] 为 2

function test(byte[] a){

a[0] = 2;

}

----------------------------

byte类型的范围不同

C#是 0 至 255

java 是 -128 至 127

默认情况下是可以直接转换的。

如果在java上写255,可以这样 (byte)255。

有一种情况需要注意 在位运算(如操作符 <= >= << >>)等操作时,结果会不一样。

一般像这种情况,都是遇到最基础的函数问题,建议在网上搜集一下相关的java版的函数。

----------------------------

Zlib压缩

C#上采用的byte[]数组压缩转换为java版的如下,别的压缩后结果不一样(这个问题当时花了两天时间)

/**

 * 压缩

 * 

 * @param data

 *            待压缩数据

 * @return byte[] 压缩后的数据

 */

public static byte[] compress(byte[] data) {

byte[] output = new byte[0];

Deflater compresser = new Deflater();

compresser.reset();

compresser.setInput(data);

compresser.finish();

ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);

try {

byte[] buf = new byte[1024];

while (!compresser.finished()) {

int i = compresser.deflate(buf);

bos.write(buf, 0, i);

}

output = bos.toByteArray();

} catch (Exception e) {

output = data;

e.printStackTrace();

} finally {

try {

bos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

compresser.end();

return output;

}

----------------------------

返回首页的跳转

Intent intent = new Intent(mContext, MainActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent);

跳回首页最好加这两个参数,可以保证界面返回不会重复。

----------------------------

DES加密算法

java版的如下。网上有很多不正确的版本。

/**

 * des加密算法,ECB方式,NoPadding模式,数据字节必须是8的整数倍

 * 

 * @param key

 * @param data

 *            数据字节必须是8的整数倍

 * @return

 * @throws Exception

 */

public static byte[] encryptECBPKCS5Padding(byte[] key, byte[] data) throws Exception {

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

DESKeySpec desKeySpec = new DESKeySpec(key);

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

return cipher.doFinal(data);

}

原文地址:https://www.cnblogs.com/yuer01/p/5709867.html