在java中将字符串转换为压缩十进制

Posted

技术标签:

【中文标题】在java中将字符串转换为压缩十进制【英文标题】:Convert String to packed decimal in java 【发布时间】:2021-01-14 12:49:07 【问题描述】:

我有一个用例,我需要为大型机创建一个文件,其中包含使用 Java 的文本和压缩十进制。

我在 Stack Overflow 上经历了很多线程,但似乎没有任何效果。我正在使用 JTOpen 库。

这是我写的一个示例程序:

package com.amazonaws.samples.util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.StringJoiner;

import com.ibm.as400.access.AS400PackedDecimal;

public class PackedDecimalTest 

    public static void main(String args[]) throws IOException 
        AS400PackedDecimal packedDecimal = new AS400PackedDecimal(8, 0);
        BigDecimal javaBigDecimal = new BigDecimal("20200521");
        byte[] convertedBytesArray = packedDecimal.toBytes(javaBigDecimal);

        try (FileOutputStream fos = new FileOutputStream("test.txt", false)) 

            //StringJoiner joiner = new StringJoiner(" ");
            //String firstName = new String("firstName1");
            //String lastName = new String("lastName1");
            //String empId = new String("1111");
            //String dept = new String("empDept1");
            //String n = new String("N");
            //joiner = joiner.add(firstName).add(lastName).add(empId).add(dept).add(n);
            //fos.write(joiner.toString().getBytes());
            fos.write(convertedBytesArray);

        

        try (FileInputStream fis = new FileInputStream("test.txt")) 
            BigDecimal convertedBigDecimal = (BigDecimal) packedDecimal.toObject(fis.readAllBytes());
            System.out.println(convertedBigDecimal.toString());
        
    


当我编写文件并立即读取它时,它似乎在 Java 中运行良好。我能够正确地看到输出。

但是,当在大型机中打开同一个文件时,我看不到打包的十进制数据。

这是我在大型机中查看数据的方式:

我几乎不知道需要做些什么来修复它。关于我做错了什么的任何指示?如何在同一个文件中同时写入 ASCII 和压缩十进制数据?在为大型机编写文件以正确读取数据之前,是否需要定义任何字符集?我可以将它写在 .txt 文件中,还是文件扩展名应该不同或扩展名没有意义?我对它支持的大型机和文件格式以及字符集一无所知。

【问题讨论】:

【参考方案1】:

鉴于压缩十进制实际上是一个“二进制”值,您需要使用主机编码(CP-037 或 CP-1047 或您的首选代码页)和压缩十进制“二进制”来创建文件字段,然后将文件作为二进制文件传输。我不熟悉用于 AS/400 的代码页,但无论如何都是同样的问题。

如果您使用scp,文件将进行隐式转换,这将损坏文件。

使用 FTP / FTPS 使用二进制模式进行传输。

这是从一个代码页转换为另一个代码页的方法的链接。

Converting String from One Charset to Another

【讨论】:

谢谢@Hogstrom,在用java写文件时,我们可以写成文本文件还是任何特定的文件格式? 我认为此链接将帮助您实现您希望实现的功能***.com/questions/29667977/…【参考方案2】:

您看到的损坏来自将 ASCII 文件转换为 EBCDIC。你 需要将文件写成 EBCDIC 并进行二进制(直接无翻译)传输到大型机。

根据@Hogstroms 的回答,

改变

        fos.write(joiner.toString().getBytes());

        fos.write(joiner.toString().getBytes("cp037"));

这会将文件写入为 EBCDIC。 您需要将 Mainframe 传输更改为二进制。


您可能会发现 JRecord 很有用,特别是如果您有 cobol Copybook。

【讨论】:

感谢@Bruce Martin,将尝试您提供的代码 sn-p 嗨@Bruce Martin,我尝试使用JRecord,当我们将文件导入大型机时,写入文件的所有数据都以单行形式出现。大型机如何知道线路的终点?它是基于抄本中定义的长度吗?我正在尝试通过在没有副本的情况下导入大型机来测试通过 Jrecord 生成的文件。 @praveen 在大型机的文件定义中。您可以在发送文件时指定 recfm=fb,lrecl/b;lsize 等或发送到具有正确属性的现有大型机

以上是关于在java中将字符串转换为压缩十进制的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中将字符串转换为十六进制

如何在Java中将字符从字母字符转换为十六进制数字?

如何在java中将十六进制字符串转换为long?

在Java中将十六进制字符串转换为ASCII

如何在 Java 中将二进制字符串转换为以 10 为底的整数

在Java(JSP)中将十进制NCR代码转换为UTF-8