我有一个用例,需要为大型机创建一个文件,其中包含文本和使用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文件,或者文件扩展名应该不同,或者扩展名没有意义?我对大型机、文件格式及其支持的字符集一无所知。
您看到的损坏来自将ASCII文件转换为EBCDIC。您需要以EBCDIC的形式编写文件,并向大型机进行二进制(直接无翻译)传输。
以下是@Hogstroms的答案,
改变
fos.write(joiner.toString().getBytes());
到
fos.write(joiner.toString().getBytes("cp037"));
这将把文件写为EBCDIC。您需要将主机传输更改为二进制。
你可能会发现JRecord很有用,尤其是如果你有一本cobol文案的话。
鉴于压缩十进制实际上是一个“二进制”值,您需要使用大型机的编码(CP-037或CP-1047或您首选的代码页)和压缩十进制“二进制”字段创建文件,然后将文件作为二进制传输。我不熟悉AS/400使用的代码页,但无论如何都是同一个问题。
如果使用scp
文件将进行隐式翻译,这将损坏文件。
使用二进制模式的FTP/FTPS进行传输。
下面是一个链接,介绍如何从一个代码页转换到另一个代码页。
将字符串从一个字符集转换为另一个字符集
问题内容: 新来的! 情况:我正在一个需要与AS / 400服务器通信的项目中。我的任务是基本上处理将发送到AS / 400服务器的请求。为此,所有用户输入都应以EDCDIC字节为单位。 问题: 我已经设法通过以下代码将打包的小数转换为String,该代码可在该论坛上找到: 我现在的问题是我必须再次将这些字符串值转换为EBCDIC字节,以便AS / 400服务器可以理解它。我打算做一些事情,例如使
问题内容: 我试图在Java中将类似“ testing123”的字符串转换为十六进制形式。我目前正在使用BlueJ。 并将其转换回去,除了向后转换,是否一样? 问题答案: 这是将其转换为十六进制的简短方法:
我有一个像“示例”这样的字符串。我想得到十六进制格式的字符串;像这样: 请给出C#语法。
问题内容: 我需要将二进制字符串转换为十六进制字符串,但是我有问题。我通过这种方法将二进制字符串转换为十六进制字符串: 没关系!但是我丢失了字符串左侧的零。例如: 该方法返回此:123456789ABCDEF,但我想返回此: 00000123456789ABCDEF 问题答案: 而不是我将使用解析值,然后以所需的宽度(在您的示例中为21)输出值:
问题内容: 我也想将我的二进制(在字符串中)转换为十六进制字符串,这只是一个程序片段,因为该程序只是另一个更大程序的一部分: 问题是我不知道填充是否有效,但是我确定该程序返回了二进制字符串的错误十六进制转换,我正在尝试这样做: http://www.wikihow.com/Convert-Binary-to- Hexadecimal PS:我需要实现它(不使用任何内置函数) 问题答案: 如果您不必
问题内容: 您好,我正在尝试转换十六进制字符串,例如String hexStr =“ 1b0ee1e3”; 到bigInt,理想情况下,我想将hexStr转换为其十进制形式的bigint, 我可以将字符串转换为不带问题的bigInt,但是当字符串包含十六进制值时,我会遇到问题 问题答案: 你有没有尝试过: 例如: