ここに新しい!
状況: AS/400 サーバーと通信する必要があるプロジェクトに取り組んでいます。私の仕事は、基本的に AS/400 サーバーに送信される要求を処理することです。これを行うには、すべてのユーザー入力を EDCDIC バイトにする必要があります。
問題:このフォーラムに
ある以下のコードを使用して、パック 10 進数を文字列に変換できました。
public class PackedDecimal {
public static long parse(byte[] pdIn) throws Exception {
// Convert packed decimal to long
final int PlusSign = 0x0C; // Plus sign
final int MinusSign = 0x0D; // Minus
final int NoSign = 0x0F; // Unsigned
final int DropHO = 0xFF; // AND mask to drop HO sign bits
final int GetLO = 0x0F; // Get only LO digit
long val = 0; // Value to return
for (int i = 0; i < pdIn.length; i++) {
int aByte = pdIn[i] & DropHO; // Get next 2 digits & drop sign bits
if (i == pdIn.length - 1) { // last digit?
int digit = aByte >> 4; // First get digit
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
int sign = aByte & GetLO; // now get sign
if (sign == MinusSign)
val = -val;
else {
// Do we care if there is an invalid sign?
if (sign != PlusSign && sign != NoSign)
throw new Exception("OC7");
}
} else {
int digit = aByte >> 4; // HO first
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
digit = aByte & GetLO; // now LO
val = val * 10 + digit;
// System.out.println("digit=" + digit + ", val=" + val);
}
}
return val;
} // end parse()
// Test the above
public static void main(String[] args) throws Exception {
byte[] pd = new byte[] { 0x19, 0x2C }; // 192
System.out.println(PackedDecimal.parse(pd));
pd = new byte[] { (byte) 0x98, 0x44, 0x32, 0x3D }; // -9844323
System.out.println(PackedDecimal.parse(pd));
pd = new byte[] { (byte) 0x98, 0x44, 0x32 }; // invalid sign
System.out.println(PackedDecimal.parse(pd));
}
}
ここでの問題は、AS/400 サーバーが理解できるように、これらの文字列値を EBCDIC バイトに再度変換する必要があることです。Silverlake のドキュメントで指定されている形式を使用して、リクエスト (raw バイト) を作成するようなことを計画しています。リクエストが作成されたら、(セッターとゲッターを使用して) リクエストを格納する POJO を使用して、そのリクエスト内の値を手動で変更する予定ですrequest.setField1("Stuff".getBytes(Charset.forName("Cp1047")))
。
ビット、バイト、ニブルの経験はあまりありません。誰かが私を助けてくれることを願っています。
私たちのコードには、5 バイトで構成されるパック 10 進数が見つかりました。= {00 00 00 00 0F} のようになります。上記のコードから取得した方法を使用してこれを変換すると、取得した値は 0 でした。次に、この 0 を元のバイト サイズ 5 の元の形式に変換したいと思います。