最近要改写一个核心加密认证类,从C#改写成Java。

发现在调试时,加密的数据无论如何也对不上。

经过跟踪,发现问题出在C#和Java byte类型的区别上:在C#里 byte类型是无符号的,而Java里是有符号的,所以C#里的129到Java里就成了负数。

发现了问题,解决就比较容易了,针对Java的byte,采用Int来进行存储。

通过如下代码从byte到int进行转换:

/** * from byte to int, because of byte in java is signed */ private static int toInt(int b) { return b >= 0 ? (int)b : (int)(b + 256); }

对于下面C#的代码:

private static AuthenticationTicket FromByteArray(byte[] buf) { MemoryStream ms = new MemoryStream(buf); BinaryReader reader = new BinaryReader(ms); short version = reader.ReadInt16(); short scope = reader.ReadInt16(); int key = reader.ReadInt32(); }

改写为如下形式,相当于重新实现BinaryReader的ReadInt16和ReadInt32方法。

private static AuthenticationTicket FromByteArray(int[] bufInt) { int version = readInt16(bufInt); int scope = readInt16(bufInt); long key = readInt32(bufInt); } private static int readInt16(int[] bufInt) { int i = 0; for(int j = 0; j < 2; readArrayIndex++, j++) { i += bufInt[readArrayIndex] << (j << 3); } return i; } private static long readInt32(int[] bufInt) { long i = 0; for(int j = 0; j < 4; readArrayIndex++, j++) { i += bufInt[readArrayIndex] << (j << 3); } return i; }

上面的例子说明,c#和Java虽然非常相像,但是一些关键细节的不同是需要仔细考虑的。

C#到Java byte类型冲突的解决相关推荐

  1. JAVA byte 类型

    centos 6.5 CDH 5.15 JDK 1.8 hbase 1.2 简介 不管什么数据,计算机最终存储的是二进制的0和1,每个二进制占1位(bit); 因为最早是老美发明的计算机,英语的所有字 ...

  2. Java Double类型精确运算解决

    Java中的简单浮点数类型float和double不能够进行运算. 首先我们想到的是四舍五入,Math类中的round方法不能设置保留几位小数,我们只能像这样(例如保留两位) Math.round(v ...

  3. java byte 正数最大_为什么Java byte 类型的取值范围是-128~127

    概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ,然 后 对 整个数 加 1 步骤: 1.确定byte是1个字节,也就是8位 2.最大的应该是0111 1111,因为第一位是符号位, ...

  4. C++开发报错之 “模块计算机类型x64与目标计算机x86类型冲突”

    转载请注明:https://blog.csdn.net/xitie8523/article/details/79665221 问题描述:笔记本是win7,64位,vs2010开发,计算机操作系统上创建 ...

  5. Java中byte类型的范围

    Java中为什么byte的范围是 -128~127 在java中byte类型占8位 表示的范围是0000 0000 ~ 1111 1111 总共256个数, java中byte类型有正负,最高位表示正 ...

  6. Java的byte类型详解

    前言 byte这个单词是Java八种基本数据类型之一字节的关键字,在计算机存储中以字节为单位,8位比特(bit)组成一个字节. 为什么弄清楚byte这么重要呢?因为智能硬件的数据传输大部分协议都是按字 ...

  7. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  8. byte java byte_详解java中的byte类型

    Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位 Java也提供了一个byte数据类型,并且是基本类型中的整数类型.java byte是作为最小的数字 ...

  9. Java byte类型转换成int类型时需要 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

最新文章

  1. Flask-Email实现发送大量的电子邮件(可以限制发送的邮件数)
  2. 机器学习 二分类分类阈值_分类指标和阈值介绍
  3. Spring JdbcTemplate快速入门
  4. tomcat虚拟目录和虚拟主机等相关配置
  5. 生产环境Go程序内存泄露,用pprof如何快速定位
  6. android 菜单隐藏了,隐藏一些导航菜单菜单项 – Android
  7. window 常用软件
  8. maven 强制jdk的版本
  9. uchome的安装记录
  10. deepin 20 推荐邮件客户端 Bluemail 邮箱
  11. 直播预告|无监督学习的公平性研究——美国布兰迪斯大学助理教授刘洪甫
  12. 2022-2028全球及中国食品加工机械行业研究及十四五规划分析报告
  13. 国内外对于GaN中Fe相关点缺陷结构的局域特性的研究进展
  14. vue3 编译报 ESLint: ‘defineProps‘ is not defined no-undef 错误问题
  15. 窥探SQL: 2.基础查询与排序
  16. 简信CRM:在线crm这两个指标非常重要!
  17. 对于Lattice FPGA/CPLD XO2编程,“Flash erase, program, verify, secure”和“Flash erase, program, verify, secu
  18. 聊聊IM系统的即时性和可靠性
  19. 《软件测试》第八章 配置测试
  20. 《Dive Into Python》非死不可

热门文章

  1. linux学习:文件属性(一)—— inode
  2. SQLServer CDC数据迁移和数据抽取功能介绍 2
  3. 基于Struts 2的自定义类型转换器
  4. Asp.net MVC验证那些事(4)-- 自定义验证特性
  5. 给定二叉树先序、中序遍历序列,求后序遍历
  6. async [ə'zɪŋk] 函数
  7. 营救Peter——下载XCode的六种姿势
  8. 外中断03 - 零基础入门学习汇编语言71
  9. 20172304 《程序设计与数据结构》第九周学习总结
  10. css媒体查询移动优先和pc优先