【发布时间】:2012-06-26 15:07:50
【问题描述】:
新来的!
情况: 我正在处理一个需要与 AS/400 服务器通信的项目。我的任务基本上是处理将发送到 AS/400 服务器的请求。为此,所有用户输入都应为 EDCDIC 字节。
问题:
我已经设法使用下面的代码将压缩小数转换为字符串,找到on this forum:
public class PackedDecimal {
public static long parse(byte[] pdIn) throws Exception {
// Convert packed decimal to long
final int PlusSign = 0x0C; // Plus sign
final int MinusSign = 0x0D; // Minus
final int NoSign = 0x0F; // Unsigned
final int DropHO = 0xFF; // AND mask to drop HO sign bits
final int GetLO = 0x0F; // Get only LO digit
long val = 0; // Value to return
for (int i = 0; i < pdIn.length; i++) {
int aByte = pdIn[i] & DropHO; // Get next 2 digits & drop sign bits
if (i == pdIn.length - 1) { // last digit?
int digit = aByte >> 4; // First get digit
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
int sign = aByte & GetLO; // now get sign
if (sign == MinusSign)
val = -val;
else {
// Do we care if there is an invalid sign?
if (sign != PlusSign && sign != NoSign)
throw new Exception("OC7");
}
} else {
int digit = aByte >> 4; // HO first
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
digit = aByte & GetLO; // now LO
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
}
}
return val;
} // end parse()
// Test the above
public static void main(String[] args) throws Exception {
byte[] pd = new byte[] { 0x19, 0x2C }; // 192
System.out.println(PackedDecimal.parse(pd));
pd = new byte[] { (byte) 0x98, 0x44, 0x32, 0x3D }; // -9844323
System.out.println(PackedDecimal.parse(pd));
pd = new byte[] { (byte) 0x98, 0x44, 0x32 }; // invalid sign
System.out.println(PackedDecimal.parse(pd));
}
}
我现在的问题是我必须再次将这些字符串值转换为 EBCDIC 字节,以便 AS/400 服务器能够理解它。我打算使用 Silverlake 文档中指定的格式构建请求(原始字节)。构建请求后,我计划使用存储我的请求(使用 setter 和 getter)的 POJO 手动更改该请求中的值,这样我就可以像 request.setField1("Stuff".getBytes(Charset.forName("Cp1047"))) 一样去。
我在位、字节和半字节方面没有太多经验。我希望有人可以帮助我。
在我们的代码中,我们发现了一个压缩十进制,它由 5 个字节组成。它类似于 = {00 00 00 00 0F}。我使用从上面代码中得到的方法进行转换,得到的值为 0。现在,我想将这个 0 转换回其原始形式,其原始字节大小为 5。
【问题讨论】:
-
你想要压缩十进制作为一个字节数组,就像你的输入,还是你想要实际的 n 字节作为一个实际的压缩十进制,这将是一个 Java 中的字符串?
-
@GilbertLeBlanc:我希望输出也是一个字节数组,因为我会将它传递给 AS/400 服务器。
-
我不太明白如何您尝试与 as/400 进行通信。我不完全确定压缩小数,但到目前为止,在 java 或 php 与我们的 as/400 之间进行通信时,我可以通过使用 ILE 调用或 SQL 之类的东西来避免做位/字节的东西,甚至是一些代码页问题。你如何把你的信息放在 as/400 上?
标签: java byte ascii ibm-midrange ebcdic