将 Java 卡中的十进制字节转换为十六进制字节
Converting decimal to hexadecimal byte in Java Card
我想将 Java 中的十进制(整数或短类型)转换为 Java 卡环境中的十六进制字节(仅支持字节和短类型,可能还支持 int 类型)。
示例:
int num = 254
打印结果:
0xFD
我目前使用开关和 if-else 来处理所有 256 个场景的方法完全不优雅,我想要比简单的开关或 if-else 更优雅的东西。
原因是我想在 Java 卡上手动处理 PKCS 5/7 填充,以防 PKCS5 密码无法作为后备方法使用。
我没想到你可以这样做:
if (num < 256) {
return (byte) num;
}
根据 RFC-1423、RFC-2898 和 RFC-5652,考虑到 PKCS 5 和 7 填充的填充量小于 256,现在应该已经解决了。
javacardx.framework.math
包中有一个名为 BCDTool
的 class。
Method Summary
static short convertToBCD(byte[] hexArray, short bOff,short bLen, byte[] bcdArray, short outOff)
Converts the input hexadecimal data into BCD format.
static short convertToHex(byte[] bcdArray, short bOff, short bLen, byte[] hexArray, short outOff)
Converts the input BCD data into hexadecimal format.
static short getMaxBytesSupported()
This method returns the largest value that can be used with the BCD utility functions.
static boolean isBCDFormat(byte[] bcdArray,short bOff, short bLen)
Checks if the input data is in BCD format.
请注意,此包是可选的,您的卡可能支持也可能不支持。
没有所谓的十六进制字节。在 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的值是多少,byte都会保存-128到127之间的值。如果要将byte转换为正值进行计算,可以使用:
short s = b & BYTE_MAX_UNSIGNED;
取回 0 到 255 之间的正值。
我想将 Java 中的十进制(整数或短类型)转换为 Java 卡环境中的十六进制字节(仅支持字节和短类型,可能还支持 int 类型)。
示例:
int num = 254
打印结果:
0xFD
我目前使用开关和 if-else 来处理所有 256 个场景的方法完全不优雅,我想要比简单的开关或 if-else 更优雅的东西。
原因是我想在 Java 卡上手动处理 PKCS 5/7 填充,以防 PKCS5 密码无法作为后备方法使用。
我没想到你可以这样做:
if (num < 256) {
return (byte) num;
}
根据 RFC-1423、RFC-2898 和 RFC-5652,考虑到 PKCS 5 和 7 填充的填充量小于 256,现在应该已经解决了。
javacardx.framework.math
包中有一个名为 BCDTool
的 class。
Method Summary
static short convertToBCD(byte[] hexArray, short bOff,short bLen, byte[] bcdArray, short outOff)
Converts the input hexadecimal data into BCD format.
static short convertToHex(byte[] bcdArray, short bOff, short bLen, byte[] hexArray, short outOff)
Converts the input BCD data into hexadecimal format.
static short getMaxBytesSupported()
This method returns the largest value that can be used with the BCD utility functions.
static boolean isBCDFormat(byte[] bcdArray,short bOff, short bLen)
Checks if the input data is in BCD format.
请注意,此包是可选的,您的卡可能支持也可能不支持。
没有所谓的十六进制字节。在 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的值是多少,byte都会保存-128到127之间的值。如果要将byte转换为正值进行计算,可以使用:
short s = b & BYTE_MAX_UNSIGNED;
取回 0 到 255 之间的正值。