/ / 64-बिट पर्ल में अनपैक (64-बिट) लंबे समय तक कैसे अनपैक करें? - पर्ल, 64 बिट, अनपैक

64-बिट पर्ल में अनपॅक (64-बिट) अनगिनत कैसे करें? - पर्ल, 64 बिट, अनपॅक

मैं एक असंक्रमित लंबी मान को अनसुना करने की कोशिश कर रहा हूं जो C प्रोग्राम से पर्ल लिपि के माध्यम से एक पर्ल से गुजरा है :: IPC।

यह ज्ञात है कि मूल्य सही है (मैंने बनायापरीक्षण जो दो कतारों में समान मूल्य भेजता है, एक पर्ल द्वारा पढ़ा जाता है और दूसरा सी एप्लिकेशन द्वारा), और सभी पूर्ववर्ती मानों को सही तरीके से पढ़ा जाता है (उपयोग q के बजाय i! 64-बिट पूर्णांक के साथ काम करने के लिए)।

यह भी ज्ञात है कि PHP था कुछ समान बग्स में ("64 बिट मशीनों पर अहस्ताक्षरित लंबी खोज") PHP में 64-बिट आर्किटेक्चर पर 64-बिट इंट पैक / पैक करें)

अब तक किए गए तर्क:

  • .. क्यू (= कुछ मूल्य जो उम्मीद से बड़ा है)
  • ..L (= 0)
  • ..L! (= बड़ा मूल्य)
  • .. एल (= 0)
  • ..l! (= बड़ा मूल्य)
  • ..lN! (= 0)
  • ..N, ..N! (= 0)

use bigint; use bignum; -- कोई प्रभाव नहीं।

विवरण:

  • sizeof(unsigned long) = 8;
  • Data::Dumper->new([$thatstring])->Useqq(1)->Dump(); कुछ सार्थक के साथ बहुत सारे शून्य बाइट्स
  • byteorder = "12345678";

उपाय: - x4Q चार बाइट्स गद्दी के साथ।

उत्तर:

जवाब के लिए 3 № 1

का उपयोग कर खोलना Q में नमूना 64-बिट पर्ल होने पर बॉक्स से बाहर काम करता है:

The TEMPLATE is a sequence of characters that give the order
and type of values, as follows:

...

q   A signed quad (64-bit) value.
Q   An unsigned quad value.
(Quads are available only if your system supports 64-bit
integer values _and_ if Perl has been compiled to support those.
Causes a fatal error otherwise.)

अधिक मजबूत समाधान के लिए, मूल्य को 8-बाइट स्ट्रिंग में अनपैक करें और उपयोग करें Math::Int64 मॉड्यूल को पूर्णांक में बदलने के लिए:

use Math::Int64 qw( :native_if_available int64 );

...

$string_value = unpack("A8", $longint_from_the_C_program);

# one of these two functions will work, depending on your system"s endian-ness
$int_value = Math::Int64::native_to_int64($string_value);
$int_value = Math::Int64::net_to_int64($string_value);

उत्तर № 2 के लिए 1

समाधान सरल था: जोड़ा गया x4Q वास्तविक मूल्य से पहले चार बाइट्स को छोड़ना; पैडिंग / अलाइनमेंट के बारे में अधिक दृष्टि से विचार करने की आवश्यकता है।