我想将Java中的十进制(整数或短类型)转换为Java Card环境中的十六进制字节(仅支持字节和短类型以及可能的int类型)。
示例:
int num = 254
打印结果:
0xFD
我目前使用开关和if-else来处理所有256个场景的方法都非常不优雅,并且想要比简单的开关或if-else更优雅的东西。
原因是我想在PKCS5密码无法以某种方式作为后备方法的情况下手动处理Java Card上的PKCS 5/7填充。
答案 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格式。
请注意,此套餐是可选的,您的卡可能或可能不支持它。