我目前正在开发一个限制性环境,其中允许的唯一类型是:
byte, byte[], short, short[].
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定我无法导入外部库,因为我正在研究JavaCard,并且已经尝试过这样的事情,但结果并不好.
所以,在这里我必须管理一个大小为6字节的字节数组,它代表卡的余额(欧元),最后一个字节是美分,但现在这并不重要.
鉴于我无法访问整数,我不知道如何以我想要的方式添加两个字节.
我们举个例子:
用户输入(添加)0x00 0x00 0x00 0x00 0x00 0x57
,这对用户来说意味着增加57美分.我们现在说平衡是0x00 ... 0x26
.
我希望能够创建一种方法,可以修改平衡数组(带有进位),添加后,分数为83,并表示0x83
.我也必须处理减法,但我想我之后可以自己解决这个问题.
我的第一个猜测是掩盖每个字节的每个数字,并且首先单独工作,但这让我无处可去.
我显然不是要求一个完整的解决方案,因为我相信我的问题几乎是不可能的,但如果你对如何处理这个问题有任何想法,我将非常感激.
那么如何在Java Card上相互添加两个包含二进制编码小数的数组呢?
编辑1:常见的数组如下所示:
{ 0x00 , 0x00 , 0x01, 0x52, 0x45, 0x52}
Run Code Online (Sandbox Code Playgroud)
并且代表15 254€和52美分的大端BCD编码整数.
编辑2:嗯,我怀疑,我的卡不支持包framework.math,所以我不能使用BCDUtil或BigNumbers,这将是有用的.
use*_*421 -2
这并不是真正的十六进制,而是压缩十进制,BCD 的形式之一。
您可以使用内部进位一次对一个字节进行压缩十进制加法和减法。有一个技巧,如果需要的话,添加 6 来强制进位进入 MS 数字,然后如果有进位,则将其屏蔽并再次移出,以纠正 LS 数字。它太广泛了,无法在这里解释。
请参阅Jones 的 BCD 算术,其中展示了如何有效地使用 32 位字上的位操作数来实现压缩十进制算术。