在Java Card中将十进制转换为十六进制字节

时间:2015-06-01 04:09:30

标签: hex javacard pkcs#7 pkcs#5

我想将Java中的十进制(整数或短类型)转换为Java Card环境中的十六进制字节(仅支持字节和短类型以及可能的int类型)。

示例:

int num = 254

打印结果:

0xFD

我目前使用开关和if-else来处理所有256个场景的方法都非常不优雅,并且想要比简单的开关或if-else更优雅的东西。

原因是我想在PKCS5密码无法以某种方式作为后备方法的情况下手动处理Java Card上的PKCS 5/7填充。

3 个答案:

答案 0 :(得分:1)

没有十六进制字节这样的东西。在Java中,一个字节由8位组成。当被视为数字时,这些位包含从-128到127的8位二补码数。十六进制数是值的文本表示 - 例如Java字节 - 供人类使用。

Java Card classic通常不支持整数,因此我将展示如何将短值转换为字节。

如果你已经确定短s包含低8位的字节,那么转换很简单:

byte b = (byte) s;

如果您不确定您是否必须决定是否允许。如果您只关心8位低位:见上文。

如果您希望在字节中存储正数0..255,可以使用以下方法检查:

if (s < 0 || s > BYTE_MAX_UNSIGNED) {
    // do something nasty
}
byte b = (byte) s;

或负值-128到127:

if (s < BYTE_MIN || s > BYTE_MAX) {
    // do something nasty
}
byte b = (byte) s;

当然,常数的值是:

private static final short BYTE_MAX = 0x7F;
private static final short BYTE_MIN = -0x80;
private static final short BYTE_MAX_UNSIGNED = 0xFF;

如果你保留private static final,那么转换器会将这些常量内联到你的字节码中。

正如您所看到的,最终字节编码对于两种情况都是相同的。这就是为什么双补码是地球上每台计算机的默认编码。

请注意,无论short的值如何,该字节都将保存-128到127之间的值。如果要将字节转换为正值进行计算,可以使用:

short s = b & BYTE_MAX_UNSIGNED;

从0到255返回正值。

答案 1 :(得分:0)

我觉得你可以做到:

if (num < 256) {
   return (byte) num;
}

考虑到根据RFC-1423,RFC-2898和RFC-5652,PKCS 5和7填充的填充量小于256,这应该已经解决了。

答案 2 :(得分:0)

s.Name.Equals(subjectName) 包中有一个名为BCDTool的类。

  

方法摘要

     

javacardx.framework.math

     

将输入的十六进制数据转换为BCD格式。

     

static short convertToBCD(byte[] hexArray, short bOff,short bLen, byte[] bcdArray, short outOff)

     

将输入BCD数据转换为十六进制格式。

     

static short convertToHex(byte[] bcdArray, short bOff, short bLen, byte[] hexArray, short outOff)

     

此方法返回可与BCD实用程序函数一起使用的最大值。

     

static short getMaxBytesSupported()

     

检查输入数据是否为BCD格式。

请注意,此套餐是可选的,您的卡可能或可能不支持它。