需要java代码或逻辑才能从EBCDIC文件中解压缩COBOL COMP.字段。请帮忙
我已经尝试了以下代码来解压缩 comp。但我得到的一些价值是负数。例如 8188,我们得到 -57348
public static String getBinary(byte[] b,int decimalPointLocation) {
long val = 0;
int first_byte = b[0] & 0x0F;
for (int i = 0; i < b.length; i++) {
int low = b[i] & 0x0F;
int high = (b[i] >> 4) & 0x0f;
if (low < 0)
low *= -1;
if (high < 0)
high *= -1;
if(first_byte==15){
high = 15 -high;
low = 15 - low;
}
int num = high * 16 + low;
val = 256 * val + num;
}
if(first_byte == 15){
val++;
}
String s = ""+val;
while(s.length()<b.length*2){
s="0"+s;
}
if(first_byte == 15){
s="-"+s;
}
if (decimalPointLocation > 0) {
s = s.substring(0,
(s.length() - decimalPointLocation))
+ "."
+ s.substring(s.length()
- decimalPointLocation);
}
return s;
}
我不使用Java,但我会尝试解释正在发生的事情。
值8188
以大端十六进制0x1ff8
。当您的程序运行时,结果实际上是8188 - 65536 = -57348
。这就是为什么你得到了你所做的结果。
由于输入是大端二进制,因此只应检查b[0]
的第一个位是否有符号。我在 C# 中所做的是,
public static String GetBinary(byte[] b, int decimalPointLocation)
{
long val = 0;
if ((b[0] & 0x80) != 0)
{
val = -1;
}
for (int i = 0; i < b.Length; i++)
{
val = (val << 8) + b[i];
}
string s = Convert.ToString(val);
return s;
}
对于byte[] b = {0x1f, 0xfc}
返回的值为8188
。对于byte[] b = {0xe0, 0x04}
返回的值为-8188
。
虽然我确实使用了类似的子字符串操作来插入这些值的小数点,但您需要注意,使用该方法无法将小于 100 的绝对整数值正确格式化为小数点后两位。