Как преобразовать ASCII в бинарный файл мэйнфрейма через код Java?

Наше приложение имеет модуль, написанный на C / C ++, который возьмет файл ascii и преобразует его в файл ebcdic, который позже будет загружен в мэйнфрейм.

Теперь нас просят переписать этот код C / C ++ на Java. У нас есть 4 различных типа вывода, один как обычный символ, затем упакованный десятичный код, двоичный файл мэйнфрейма и число с плавающей запятой. Каждый из них будет иметь отдельную входную длину ascii и соответствующую выходную длину ebcdic.

При этом мы не можем преобразовать один конкретный тип двоичного файла мэйнфрейма, в который он преобразует входные данные из 11 байтов в выходной 4-байтовый двоичный файл из мейнфрейма.
Один пример ввода — «451841», а вывод в ebcdic файле при открытии в unix с помощью команды less — «^ @ ^ 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 значение приходит примерно так:
^ @ ^ @ ^ @ ^ А

Мы используем версию 1.5. Может кто-нибудь помочь мне понять, как переписать этот код C в Java версии 1.5? Еще одна вещь, хотя temp_area [11] имеет длину 11 символов, максимальное значение, которое мы имеем, составляет 6 цифр.

1

Решение

Вам не удалось сдвинуть 8-битные значения вниз после маскировки:

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

должно быть:

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

Обратите внимание, что, сдвигая сначала, мы можем опустить громоздкие большие константы и всегда просто делать 8-битное маскирование.

1

Другие решения

Когда вы И значение b, вам нужно сдвинуть его вниз до последних 8 бит.

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

По вопросам рекламы [email protected]