java - 如何通过java代码将ASCII码转换成主机二进制码?

标签 java c++ c ascii ebcdic

我们的应用程序有一个用 C/C++ 编写的模块,它将获取一个 ascii 文件并将其转换为一个 ebcdic 文件,该文件稍后将通过 ftp 传输到大型机。

现在我们被要求用 java 重写这段 C/C++ 代码。我们有 4 种不同的输出类型,一种是普通字符,然后是压缩十进制、大型机二进制和 float 。每个都有一个单独的输入 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 位数字。

最佳答案

您在屏蔽后未能将 8 位值向下移动:

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

应该是:

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

请注意,通过先移位,我们可以省略笨重的大常量,而始终只进行 8 位掩码。

关于java - 如何通过java代码将ASCII码转换成主机二进制码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20998090/

相关文章:

java - 语言规范是如何创建的

java - 如何从 Java 中的字符串中删除前导和尾随空格?

c++ - 如何从一个非常大的数字的 C++ 字符串中提取所有数字?

c++ - tcp 套接字服务器不发送

c++ - OS X 上的 LLVM 与 clang

java - JAVA 文件中的 JFlex 编译错误

JavaCC 识别 token 中的 token

c++ - 从 Ubuntu 运行一个可执行文件到 Debian

c - 如何释放 BITMAP 结构?

Java 和 C : different outputs of same code