روبي - اقرأ بايت من ملف، تحويل إلى عدد صحيح
سؤال
أحاول قراءة أعداد صحيحة غير موقعة من ملف (مخزن ك 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 تكرار عبر بايت ملف بواسطة بايت.
ما هو التنسيق الأرقام المخزنة في الملف؟ هل هو في عرافة؟ شفرة الخاص بك تبدو صحيحة بالنسبة لي.
عند التعامل مع البيانات الثنائية، تحتاج إلى التأكد من أنك تفتح الملف في الوضع الثنائي إذا كنت على 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 إنها مشكلة نبيذة.