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);
}