Java:将字符串转换为压缩十进制

标签 java byte ascii ibm-midrange ebcdic

新来的!

情况: 我正在从事一个需要与 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 的原始形式。

最佳答案

IBM Toolbox for Java and JTOpen图书馆提供data conversion正是为了这个目的而开设的类(class)。

关于Java:将字符串转换为压缩十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210356/

相关文章:

c# - AES解密加密

Java 正则表达式 replaceAll 多行

java - 如何将键转换为字符串,反之亦然

Java邮件异常

c++ - 在 C++ 中从字节数组检索整数的最佳方法是什么

C# - 读取二进制中的十六进制字节序列

objective-c - 如何在 objective-c 中将字节值转换为 int

php - 如何使用 PHP 从字符串中截断非 ascii 字符

java - 排序链表

.net - 如何在 .NET 中将 ASCII 值转换为字符