需要Java代码或逻辑来解压缩COBOL COMP。 EBCDIC文件中的字段。请帮助
我已经尝试了以下代码来解压缩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;
}
答案 0 :(得分:2)
我不使用Java,但是我将尝试解释正在发生的事情。
值8188
为0x1ff8
,以大尾数形式表示。运行程序时,结果实际上是8188 - 65536 = -57348
。这就是为什么要获得结果的原因。
由于输入为big-endian二进制,因此仅应检查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的绝对整数值不能使用该方法正确设置两个小数位的格式。