Наше приложение имеет модуль, написанный на 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 цифр.
Вам не удалось сдвинуть 8-битные значения вниз после маскировки:
stringBuffer.append((char) (0xFF000000 & (b)));
должно быть:
stringBuffer.append((char) ((b >> 24) & 0xff));
Обратите внимание, что, сдвигая сначала, мы можем опустить громоздкие большие константы и всегда просто делать 8-битное маскирование.
Когда вы И значение b, вам нужно сдвинуть его вниз до последних 8 бит.
stringBuffer.append((char) ((0x0000FF00 & (b)) >> 8));