การแปลง EBCDIC Char เป็นค่า Hex (ข้อมูล AFP EBCDIC)

ฉันทำงานกับข้อมูล EBCDIC บางอย่างที่ฉันต้องแยกวิเคราะห์และค้นหาค่า Hex บางค่า ปัญหาที่ฉันพบคือดูเหมือนว่าฉันกำลังอ่านไฟล์ด้วยการเข้ารหัสที่ไม่ถูกต้อง ฉันเห็นว่าบันทึกของฉันเริ่มต้นด้วย "!" (ซึ่งก็คือ 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

ขอบคุณ!


person Tom Alderman    schedule 13.04.2009    source แหล่งที่มา


คำตอบ (3)


ใช่ เมื่อคุณอ่านข้อมูลข้อความในรูปแบบสตริง ข้อมูลจะจัดเก็บไว้ภายในในรูปแบบ Unicode หากคุณสนใจค่า binary (เช่น ไบต์ดิบ) ก็อย่าถอดรหัสมันตั้งแต่แรก

หากคุณต้องการทำอะไรก็ตามด้วยการเข้ารหัส EBCDIC แบบกำหนดเอง คุณสามารถใช้ การใช้งาน EBCDIC แบบโอเพนซอร์ส - แต่ฉันคิดว่าคุณแค่ต้องตัดสินใจจริงๆ ว่าคุณกำลังถือว่าสิ่งนี้เป็นข้อมูลไบนารีหรือข้อความ

person Jon Skeet    schedule 13.04.2009

คุณสามารถทำได้เช่นนี้:

  1. เปิดไฟล์ AFP อ่าน 9 ไบต์แรก
  2. ไบต์ 0 ควรเป็น 0xD3 หรือ 0x5A ไบต์ 1 และไบต์ 2 จะเป็นความยาวของ SFI รวมถึง 8 จาก 9 ไบต์ที่คุณเพิ่งอ่าน มันเป็น endian ขนาดใหญ่ ดังนั้นความยาว = byte1 * 256+byte2
  3. ไบต์ 3, 4 และ 5 คือตัวระบุฟิลด์ที่มีโครงสร้าง หากคุณกำลังมองหาข้อความที่พิมพ์ได้ ให้มองหา PTX (องค์ประกอบข้อความการนำเสนอ) 0xD3 0xEE 0x9B ข้ามความยาว -8 ไปข้างหน้าแล้วอ่าน 9 ไบต์ถัดไปหากคุณไม่พบ
  4. หากคุณพบ PTX ให้อ่านความยาว 8 ไบต์ การแยกวิเคราะห์ลำดับการควบคุมเพื่อไปยังข้อความนั้นค่อนข้างยุ่งยากเล็กน้อย ตัวแรกจะเริ่มต้นด้วย 0x2b 0xD3 หนึ่งไบต์สำหรับความยาว และไบต์สำหรับลำดับการควบคุมประเภทใด หากไบต์นี้เป็นเลขคี่ ลำดับการควบคุมถัดไปจะละเว้นส่วนหัว 0x2B 0xD3 โดยเริ่มจากไบต์ที่มีความยาวแทน สิ่งนี้เรียกว่า "การผูกมัด" และเห็นได้ชัดว่าได้รับการแนะนำให้รู้จักกับไดรฟ์โปรแกรมเมอร์ที่พยายามแยกวิเคราะห์สิ่งนี้อย่างบ้าคลั่ง
  5. ข้ามไปข้างหน้าจากความยาวไบต์ length-1 แล้วกดบนหรือเพียงแค่มองหา 0x2B 0xD3 ถัดไป ลำดับการควบคุมสุดท้ายจะไม่ถูกโยง และทุกสิ่งที่ตามมาจนถึงจุดสิ้นสุดของ PTX จะเป็น EBCDIC ใช้ไลบรารีของ Jon Skeet (ขอบคุณ Jon) และค้นหาองค์ประกอบ PTX ถัดไป

ขออภัยที่ฉันยืดยาว มันทำได้แต่ไม่ง่ายเลย

person R Ubben    schedule 14.04.2009

โปรดใช้ความระมัดระวังในการอ่านข้อมูล AFP ในลักษณะนั้น มันเป็น big-endian ทั้งแบบไบต์และบิต คุณจะต้องคำนึงถึงสิ่งนั้นหากคุณถือว่ามันเป็นข้อมูลไบนารี เช่น การแยกวิเคราะห์ผ่านฟิลด์ที่มีโครงสร้างในเอกสาร

person R Ubben    schedule 13.04.2009
comment
ข้อมูลเขตข้อมูลที่มีโครงสร้างคือสิ่งที่ฉันพยายามรับ ขอบคุณสำหรับข้อมูล - person Tom Alderman; 14.04.2009