需要Java代码/逻辑来提取COMP。来自EBCDIC文件的字段

需要Java代码/逻辑来提取COMP。来自EBCDIC文件的字段,java,cobol,copybook,Java,Cobol,Copybook,需要java代码或逻辑来解包COBOL组件。EBCDIC文件中的字段。请帮忙 我尝试了以下代码来解包comp。但我得到的一些价值是负的。我们得到的是as-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++) {

需要java代码或逻辑来解包COBOL组件。EBCDIC文件中的字段。请帮忙

我尝试了以下代码来解包comp。但我得到的一些价值是负的。我们得到的是as-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;
}
公共静态字符串getBinary(字节[]b,整数分点位置){
长val=0;
int first_byte=b[0]&0x0F;
for(int i=0;i>4)和0x0f;
如果(低<0)
低*=-1;
如果(高<0)
高*=-1;
如果(第一个字节==15){
高=15-高;
低=15-低;
}
int num=高*16+低;
val=256*val+num;
}
如果(第一个字节==15){
val++;
}
字符串s=”“+val;
while(s.length()0){
s=s.子串(0,
(s.长度()-分点位置))
+ "."
+s.子字符串(s.长度()
-分点位置);
}
返回s;
}

我不使用Java,但我会尝试解释发生了什么

8188
是以大端十六进制表示的
0x1ff8
。当程序运行时,结果实际上是
8188-65536=-57348
。这就是为什么你得到了你所做的结果

因为输入是大端二进制,所以只需检查
b[0]
的第一位是否有符号。我在C#所做的是

公共静态字符串GetBinary(字节[]b,整数分点位置)
{
长val=0;
如果((b[0]&0x80)!=0)
{
val=-1;
}
for(int i=0;ival=(VAL)这不是我的家庭作业网站。请阅读帮助中心来知道如何在这里提问,这样你就可以得到答案而不是问题。对不起,我已经添加了已经不能正常工作的代码。你可能会考虑删除你的问题。然后阅读并写一个新的更好的问题。那些- 10很可能坚持。甚至阻止人们看你的问题。虽然,已经有-7人了。@Lino比你想象的还要多。这个星球上仍然有大型机,它们仍在运行大量的cobol代码,如果没有这些,我们的世界将变得非常不同。你不会“解包”COBOL COMP变量。您可以解包COBOL COMP-3变量。COMP类似于Java中的原始数据类型int。COMP-3是打包的。它是哪一个?
    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;
    }