كيفية تحويل العشرية غير المعبأة إلى Comp-3؟ [مغلق

StackOverflow https://stackoverflow.com/questions/4337912

  •  30-09-2019
  •  | 
  •  

سؤال

لقد طرحت سؤالاً حول تحويل حقول شركات ، لم أحصل عليها أي إجابة.

آمل أن يساعدني Stack-Overflow في هذا السؤال.

لقد نجحت في تحويل Comp-3 إلى عشري. أحتاج إلى مساعدتكم في تحويل الظهير العشري غير المعبأ إلى Comp-3 ، بأي لغة برمجة عالية المستوى ، ولكن يفضل في Java أو C#.NET.

هل كانت مفيدة؟

المحلول

في العشرية المعبأة -123 يتم تمثيلها على أنها X'123D "(آخر Nyble C أو D أو F هو العلامة). واحدة من أبسط الطرق للتعامل مع العشرية المعبأة هي ببساطة تحويل البايت إلى سلسلة سداسية (أو العكس كما هو مطلوب) ثم استخدم معالجة السلسلة العادية. قد لا يكون هذا هو الأكثر كفاءة ولكن من السهل تنفيذها.

لذا فإن تحويل عدد صحيح (القيمة) إلى العشرية المعبأة هو تقريبًا (ملاحظة: لم أختبر الرمز)

String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();

فيما يلي بعض رمز المثال لتحويل/من Comp3 لاسترداد عشري معبأة من مجموعة من البايتات ، انظر طريقة getMainframePackedDecimal في http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/src/net/sf/jrecord/common/conversion.java؟revision=3&view=markup

ولتعيين عشري معبأة ، انظر Setfield In http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/src/net/sf/jrecord/types/typackedDecimal.javamamenspision=3&view=markup

يأخذ كلا الروتين مجموعة من البايتات ، وضع بدء وإما طول موضع الحقل.

هناك أمثلة أخرى للقيام بذلك على الويب (Jranch أعتقد أن لديها رمز للقيام بالتحويل أيضًا) ، القيام ببعض googling.

نصائح أخرى

من السهل جدًا تحويل العشرية المخصصة إلى COMP-3-اقلب القلائم من البايت المنخفض وتجريد من القمة العالية لجميع البايتات الأخرى.

ضع في اعتبارك الرقم 12345 -في تدوين عشري معبأة ، سيكون هذا هو X'12345C 'أو X'12345F "(كلا C و F هما +و AB و D -). عندما قمت بتحويلها إلى عشرية مخصصة ، انقلبت على حلقة منخفضة وأدخلت "F" في المقاومة العالية بين كل رقم. تحويله إلى x'f1f2f3f4c5 '.

لتحويلها مرة أخرى ، يمكنك فقط عكس العملية. باستخدام Java ، من شأنه أن يبدو:

byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];

//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111)  << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111)  << 4)) | (myDecimal[3] & 0b00001111);

//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111)  << 4)) | (myDecimal[4] & 0b00001111);

عندما أفسدت COMP-3 في الماضي مع Java ، انتهى بي الأمر إلى كتابة طريقة للقراءة في البايتات وتحويلها إلى رقم. لا أعتقد أنه كان عليّ أن أكتب Comp-3 من قبل ، لكنني أفترض أنني سأستخدم نفس المنطق في العكس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top