سؤال

أنا أعمل مع بعض بيانات EBCDIC التي أحتاج إلى تحليلها وإيجاد بعض قيم عرافة. المشكلة التي أحصل عليها هي أنه يبدو أنني أقرأ الملف بترميز غير صحيح. أستطيع أن أرى أن سجل بلدي يبدأ ب "!"(وهو x5A في EBCDIC) ولكن عند القيام بالتحويل إلى عرافة تعود ك x21, ، والتي هي قيمة ASCII ل "!".

كنت آمل أن تكون هناك طريقة مدمجة في الإطار، لكنني أخشى أنني سأضطر إلى إنشاء فئة مخصصة لتصحيح مجموعة أحرف EBCDIC بشكل صحيح.

Using fileInStream As New FileStream(inputFile, FileMode.Open, FileAccess.Read)
   Using bufferedInStream As New BufferedStream(fileInStream)
      Using reader As New StreamReader(bufferedInStream, Encoding.GetEncoding(37))
         While Not reader.EndOfStream
            Do While reader.Peek() >= 0
               Dim charArray(52) As Char
               reader.Read(charArray, 0, charArray.Length)

               For Each letter As Char In charArray
                  Dim value As Integer = Convert.ToInt16(letter)

                  Dim hexOut As String = [String].Format("{0:x}", value)
                  Debug.WriteLine(hexOut)
               Next
            Loop
         End While
      End Using
   End Using
End Using

شكرا!

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

المحلول

نعم، عندما تقرأ بيانات النص في كسلاسل، فإنها تخزينها داخليا كوحيد يونيكود. إذا كنت تهتم الثنائية القيم (أي البايت الخام) ثم لا تفصصها في المقام الأول.

إذا كنت بحاجة حقا إلى فعل أي شيء باستخدام ترميز EBCDIC مخصص، فيمكنك استخدام بلدي تطبيق تطبيق EBCDIC مفتوح - لكنني أعتقد أنك حقا بحاجة فقط إلى تعويض عقلك فيما إذا كنت تعامل مع هذا كبيانات أو نص ثنائي.

نصائح أخرى

يمكنك أن تفعل ذلك مثل هذا:

  1. افتح ملف AFP. قراءة أول 9 بايت.
  2. يجب أن يكون byte 0 0xd3 أو 0x5a. بايت 1 وبايت 2 سيكون طول SFI، بما في ذلك 8 من 9 بايت قرأت للتو. إنه نبيث كبير، لذلك طول = BYTE1 * 256 + BYTE2.
  3. بايت 3 و 4 و 5 هو المعرف الميداني المنظم. إذا كنت تبحث عن نص قابل للطباعة، ابحث عن PTX، (عنصر نص العرض التقديمي) 0xd3 0xee 0x9b. تخطي طول الأمام - 8 وقراءة 9 بايت 9 التالي إذا لم تجدها.
  4. إذا وجدت PTX، اقرأ الطول 8 بايت. تحليل من خلال تسلسل التحكم للوصول إلى النص أمر صعب للغاية. سيبدأ الأول مع 0x2b 0xd3، بايت للطول، و البايت لأي نوع من تسلسل التحكم هو. إذا كان هذا البايت رقم فردي، فسيتم حذف تسلسل التحكم التالي رأس 0x2b 0xd3، بدءا من البايت البايت بدلا من ذلك. ويسمى هذا "التسلسل" وتم تقديمه على ما يبدو لدفع المبرمجين الذين يحاولون تحليل هذه الأشياء مجنون.
  5. تخطي إلى الأمام من طول البايت الطول - 1 ثم اضغط على أو مجرد البحث عن 0x2b التالي 0xd3؛ لن يتم سلسل تسلسل التحكم الأخير، وسيكون كل شيء يتبع إلى نهاية PTX سيكون ebcdic. استخدم مكتبة JON SKEET (شكرا، JON) وابحث عن عنصر PTX التالي.

آسف كنت قد لطوع طويل. إنه قابل للقيام، ولكن ليس بسيطا.

كن حذرا قراءة بيانات AFP بهذه الطريقة. إنه إينتيان كبير في كل من البايت والطلب قليلا. ستحتاج إلى حساب ذلك إذا كنت تعاملها كبيانات ثنائية، مثل التحليل من خلال الحقول المهيكلة في وثيقة.

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