روبي - اقرأ بايت من ملف، تحويل إلى عدد صحيح

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

  •  19-09-2019
  •  | 
  •  

سؤال

أحاول قراءة أعداد صحيحة غير موقعة من ملف (مخزن ك byte متتالية) وتحويلها إلى الأعداد الصحيحة. لقد جربت هذا:

file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value  will be less than expected

ماذا أفعل الخطأ هنا؟

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

المحلول 4

حسنا، حصلت عليه للعمل:

num = file.read(8).unpack("N")

شكرا لجميع مساعدتكم.

نصائح أخرى

أنت لا تقرأ ما يكفي من البايتات. كما تقول في تعليق إجابة تدمان، تحصل 202 بدلا من 3405691582

لاحظ أن أول 2 بايت من 0xCAFEBABE يكون 0xCA = 202

إذا كنت تريد حقا كل البايتات 8 في رقم واحد، فأنت بحاجة إلى قراءة أكثر من القصيرة غير الموقعة

يحاول

num = file.read(8).unpack("L_")

يتفير الشرطة السفلية أن الطويل الأصلي سيكون 8 بايت، وهذا بالتأكيد غير مضمون.

ماذا عن النظر في pickaxe؟ (روبي 1.9، ص. 44)

File.open("testfile") 
do |file|
    file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end

كل_BYTE تكرار عبر بايت ملف بواسطة بايت.

هناك عدة مكتبات تساعد في تحليل البيانات الثنائية في روبي، من خلال السماح لك بإعلان تنسيق البيانات في DSL تعريفي بسيط رفيع المستوى، ثم اكتشف كل التعبئة والتغليف والتغليف والتغيب عن التحويلات الإناث أنفسهم.

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

ما هو التنسيق الأرقام المخزنة في الملف؟ هل هو في عرافة؟ شفرة الخاص بك تبدو صحيحة بالنسبة لي.

عند التعامل مع البيانات الثنائية، تحتاج إلى التأكد من أنك تفتح الملف في الوضع الثنائي إذا كنت على Windows. هذا ينطبق على كل من القراءة والكتابة.

open(filename, "rb") do |file|
  num = file.read(2).unpack("S")
  puts num
end

قد تكون هناك أيضا مشاكل مع ترميز "Endian" اعتمادا على منصة المصدر. على سبيل المثال، الآلات القائمة على PowerPC، والتي تشمل أنظمة Mac القديمة وخوادم IBM POWER أو مجموعات PS3 أو خوادم Sun SPARC.

يمكنك نشر مثال على كيفية "أقل"؟ عادة ما يكون هناك نمط واضح للبيانات.

على سبيل المثال، إذا كنت تريد 0x1234 لكنك تحصل على 0x3412 إنها مشكلة نبيذة.

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