如何通过java代码将ASCII转换为大型机二进制文件?

时间:2014-01-08 14:13:58

标签: java c++ c ascii ebcdic

我们的应用程序有一个用C / C ++编写的模块,它将采用ascii文件并将其转换为ebcdic文件,稍后将其转换为大型机。

现在要求我们在java中重写这个C / C ++代码。我们有4种不同的输出类型,一种是普通字符,然后是压缩十进制,主机二进制和浮点数。每个都有一个单独的输入ascii长度和相应的输出ebcdic长度。

执行此操作时,我们无法转换一种特定类型的主机二进制文件,它将11字节的输入转换为4字节大型机二进制的输出。 一个示例输入是'451841',使用less命令在unix中打开时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位数。

2 个答案:

答案 0 :(得分:1)

屏蔽后,您无法将8位值向下移动:

stringBuffer.append((char) (0xFF000000 & (b)));

应该是:

stringBuffer.append((char) ((b >> 24) & 0xff));

请注意,通过先移位,我们可以省略笨重的大常量,并且总是只进行8位屏蔽。

答案 1 :(得分:0)

当你和b的值相比时,你需要将它向下移动到最后的8位。

stringBuffer.append((char) ((0x0000FF00 & (b)) >> 8));