我们的应用程序有一个用 C/C++ 编写的模块,它将获取一个 ascii 文件并将其转换为一个 ebcdic 文件,该文件稍后将被 ftped 到大型机。
现在我们被要求用 java 重写这个 C/C++ 代码。我们有 4 种不同的输出类型,一种是普通字符,然后是压缩十进制、大型机二进制和浮点。每个都有一个单独的输入 ascii 长度和相应的输出 ebcdic 长度。
执行此操作时,我们无法转换一种特定类型的大型机二进制文件,其中它将 11 字节的输入转换为 4 字节的大型机二进制文件的输出。一个示例输入是“451841”,当在 unix 中使用 less 命令打开时,ebcdic 文件中的输出是“^@^Få^A”。
C代码如下:
/* This routine converts UNIX character data into mainframe binary */
/* representation. It is called from the switch statement when */
/* input field type is "6" */
int UNIX_mf_binary( )
{
unsigned char* out_rec;
int out_position;
int int_work_area;
long int long_int_work_area;
int char_work_area;
char temp_area[11]; // This will be having the value of ' 451841'
unsigned char* c_integer_position;
unsigned int i_integer_position;
long_int_work_area = atol(temp_area);
i_integer_position = &long_int_work_area;
c_integer_position = i_integer_position;
out_rec[out_position] = *c_integer_position;
c_integer_position = i_integer_position + 1;
out_position = out_position + 1;
out_rec[out_position] = *c_integer_position;
c_integer_position = i_integer_position + 2;
out_position = out_position + 1;
out_rec[out_position] = *c_integer_position;
c_integer_position = i_integer_position + 3;
out_position = out_position + 1;
out_rec[out_position] = *c_integer_position;
c_integer_position = i_integer_position + 4;
out_position = out_position + 1;
}
我们重写这部分的 java 代码如下所示:
String bin = " 451841";
int b;
b = Integer.parseInt(bin.trim());
stringBuffer.append((char) (0x000000FF & b));
stringBuffer.append((char) (0x0000FF00 & (b)));
stringBuffer.append((char) (0x00FF0000 & (b)));
stringBuffer.append((char) (0xFF000000 & (b)));
fos.write(stringBuffer.toString().getBytes());
但是使用 java 代码的值是这样的:^@^@^@^A
我们正在使用 jre 1.5 版。有人可以帮我理解如何在 java 1.5 版中重写这个 C 代码吗?还有一件事,即使 temp_area[11] 的长度为 11 个字符,我们在其中的最大值是 6 位。