需要 Java Code/Logic 来提取 COMP。来自 EBCDIC 文件的字段
Need Java Code/Logic to extract COMP. field from EBCDIC file
需要 java 代码或逻辑来解压 COBOL COMP。来自 EBCDIC 文件的字段。请帮忙
我试过下面的代码来解压压缩包。但是我得到的一些价值是负面的。前任。 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 的绝对整数值正确格式化为两位小数。
需要 java 代码或逻辑来解压 COBOL COMP。来自 EBCDIC 文件的字段。请帮忙
我试过下面的代码来解压压缩包。但是我得到的一些价值是负面的。前任。 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 的绝对整数值正确格式化为两位小数。