الفرق بين المراجعتين ل"Ruby/Array/pack"

من موسوعة حسوب
< Ruby‏ | Array
اذهب إلى التنقل اذهب إلى البحث
سطر 19: سطر 19:
  
 
{| class="wikitable"
 
{| class="wikitable"
!االموجه              
+
!موجهات من النوع Integer              
 
!عناصر المصفوفة
 
!عناصر المصفوفة
 
!شرح                                                                                         
 
!شرح                                                                                         
سطر 160: سطر 160:
  
 
"<code>L<</code>‎" مثلها مثل "<code>V</code>"
 
"<code>L<</code>‎" مثلها مثل "<code>V</code>"
 +
|-
 +
|
 +
|
 +
|
 +
|-
 +
|n
 +
|<code>Integer</code>
 +
|‎16-bit unsigned, network (big-endian) byte order‎
 +
|-
 +
|N
 +
|<code>Integer</code>
 +
|‎32-bit unsigned, network (big-endian) byte order‎
 +
|-
 +
|v
 +
|<code>Integer</code>
 +
|‎16-bit unsigned, VAX (little-endian) byte order‎
 +
|-
 +
|V
 +
|<code>Integer</code>
 +
|‎32-bit unsigned, VAX (little-endian) byte order‎
 +
|-
 +
|
 +
|
 +
|
 +
|-
 +
!موجهات من النوع Float
 +
!عناصر المصفوفة
 +
!شرح
 +
|-
 +
!<code>D d</code>
 +
!<code>Float</code>
 +
!توضيب أولي ‎(double-precision)، native format‎
 +
|-
 +
!<code>F f</code>
 +
!<code>Float</code>
 +
!توضيب أولي ‎(single-precision)، native format‎
 +
|-
 +
!<code>E</code>
 +
!<code>Float</code>
 +
!double-precision, little-endian byte orde
 +
|-
 +
!<code>e</code>
 +
!<code>Float</code>
 +
!single-precision, little-endian byte order
 +
|-
 +
!<code>G</code>
 +
!<code>Float</code>
 +
!double-precision, network (big-endian) byte order
 +
|-
 +
!g
 +
!<code>Float</code>
 +
!single-precision, network (big-endian) byte order
 +
|-
 +
!
 +
!
 +
!
 +
|-
 +
!موجهات من النوع String
 +
!عناصر المصفوفة
 +
!شرح
 +
|-
 +
!A
 +
!
 +
!
 
|}
 
|}
  

مراجعة 12:13، 7 سبتمبر 2018

يُحزِّمُ (packs) التابع pack محتويات المصفوفة التي استُدعيت معه على شكل تسلسل ثنائي (binary sequence) وفقًا للمُوجِّهات (directives) الواردة في المعامل aTemplateString؛ يمكن أن يتبع المُوجِّهات ","" و "A"" و ""a"" عددًا يحدّد عرض الحقل الناتج. قد تأخذ المُوجّهات المتبقية عددًا أيضًا مما يشير إلى عدد عناصر المصفوفة المطلوب تحويلها.

إذا كان العدد يمثِّل محرف النجمة ("*")، فستُحوَّل جميع عناصر المصفوفة المتبقية. يمكن أن تُتبَع أيٌّ من المُوجّهات "sSiIlL" بشرطة سفلية ("_") أو إشارة تعجب ("!") لاستخدام الحجم الأصلي للمنصة الأساسية (underlying platform) للنوع المحدد؛ خلا ذلك، ستستخدم حجمًا مستقلًا عن المنصة (platform-independent size). يتم تجاهل المسافات البيضاء في سلسلة القالب.

في حال تمرير المعامل aBufferString وكانت سعته (capacity) كافية، فسيستخدمها التابع pack كمخزن مؤقت (buffer) ثمَّ يعيدها. عندما تُحدَّد الإزاحة (offset) ببداية aTemplateString، فستُملَأ النتيجة بعد الإزاحة. في حالة وجود محتويات سابقة في aBufferString وكان طولها أكبر من الإزاحة offset، فسيُكتَب الناتج فوق ما بقي من offsetOfBuffer. أمّا إذا كان طولها أصغر، فسيُملَأ الفراغ المتبقي بالمحرف "‎\0".

البنية العامة

 pack( aTemplateString )  aBinaryString
pack( aTemplateString, buffer: aBufferString )  aBufferString

المعاملات

aTemplateString

يأخذ هذا المعامل إحدى قيم الموجهات المستعملة مع التابع pack وهي:


(لا تنس ترجمة الموجهات)

موجهات من النوع Integer عناصر المصفوفة شرح
C Integer 8 بتات بدون إشارة (‎8-bit unsigned)
S Integer 16 بتة بدون إشارة، هندي أولي ‎16-bit unsigned, native endian [uint16_t] )‎)
L Integer 32 بتة بدون إشارة، هندي أولي ‎32-bit unsigned, native endian [uint32_t] )‎)
Q Integer 64 بتة بدون إشارة، هندي أولي ‎64-bit unsigned, native endian [uint64_t] )‎)
J Integer عرض المؤشر بدون إشارة، هندي أولي (pointer width unsigned, native endian [uintptr_t]‎ )

هذا الموجه متاح منذ Ruby 2.3

c Integer 8 بتات بإشارة (‎8-bit signed)
s Integer 16 بتة بإشارة، هندي أولي ‎16-bit signed, native endian [int16_t] )‎)
l Integer 32 بتة بإشارة، هندي أولي ‎32-bit signed, native endian [int32_t] )‎)
q Integer 64 بتة بإشارة، هندي أولي ‎64-bit signed, native endian [int64_t] )‎)
j Integer عرض المؤشر بإشارة، هندي أولي (pointer width signed, native endian [intptr_t]‎ )

هذا الموجه متاح منذ Ruby 2.3

S_ S!‎ Integer عدد قصير بدون إشارة، هندي أولي (unsigned short, native endian)
I I_ I!‎ Integer عدد صحيح بدون إشارة، هندي أولي (unsigned int, native endian)
L_ L!‎ Integer عدد طويل بدون إشارة، هندي أولي (unsigned long, native endian)
Q_ Q!‎ Integer عدد طويل طويل بدون إشارة، هندي أولي (unsigned long long, native endian)

يطلق الخطأ ArgumentError في حال لم يكن في المنصة النوع long long.

متاح منذ Ruby 2.3

J!‎ Integer uintptr_t، هندي أولي (مثل J)

متاح منذ Ruby 2.3

s_ s!‎ Integer عدد قصير بإشارة، هندي أولي (signed short, native endian)
i i_ i!‎ Integer عدد صحيح بإشارة، هندي أولي (signed int, native endian)
l_ l!‎ Integer عدد طويل بإشارة، هندي أولي (signed long, native endian)
q_ q!‎ Integer عدد long long بإشارة، هندي أولي (signed long long, native endian)

يطلق الخطأ ArgumentError في حال لم يكن في المنصة النوع long long.

متاح منذ Ruby 2.3

j!‎ Integer intptr_t، هندي أولي (مثل j)

متاح منذ Ruby 2.3

S> s> S!> s!>‎

L> l> L!> l!>‎

I!> i!> ‎

Q> q> Q!> q!>‎

J> j> J!> j!>‎

Integer مثل الموجهات التي لا تحتوي "<"، باستثناء أن نوعها هندي كبير (big endian).

متاحة منذ Ruby 1.9.3

"S>‎" مثلها مثل "n"

"L>‎" مثلها مثل "N"

S< s< S!< s!<‎

L< l< L!< l!<‎

I!< i!<‎

Q< q< Q!< q!<‎

J< j< J!< j!<‎

Integer مثل الموجهات التي لا تحتوي "<"، باستثناء أن نوعها هندي صغير (little endian).

متاحة منذ Ruby 1.9.3

"S<‎" مثلها مثل "v"

"L<‎" مثلها مثل "V"

n Integer ‎16-bit unsigned, network (big-endian) byte order‎
N Integer ‎32-bit unsigned, network (big-endian) byte order‎
v Integer ‎16-bit unsigned, VAX (little-endian) byte order‎
V Integer ‎32-bit unsigned, VAX (little-endian) byte order‎
موجهات من النوع Float عناصر المصفوفة شرح
D d Float توضيب أولي ‎(double-precision)، native format‎
F f Float توضيب أولي ‎(single-precision)، native format‎
E Float double-precision, little-endian byte orde
e Float single-precision, little-endian byte order
G Float double-precision, network (big-endian) byte order
g Float single-precision, network (big-endian) byte order
موجهات من النوع String عناصر المصفوفة شرح
A

buffer: aBufferString

مخزن مؤقت يستعمل -إن كانت سعته كافية- لتخزين ناتج تنفيذ التابع pack فيه. انتبه إلى أنَّ الخيار "buffer:‎'' لا يضمن عدم تخصيص الذاكرة في التابع pack. إذا كانت سعة aBufferString غير كافية، فسيَحجز التابع pack حجمًا مناسبًا من الذاكرة.

القيم المعادة

يعاد كائنٌ من النوع aBinaryString، أو تخزَّن هذه البيانات المعادة في المعامل aBufferString (إن أعطي) ثم يعاد.

أمثلة

أمثلة على استخدام التابع pack:

 a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
a.pack("A3A3A3")   #=> "a  b  c  "
a.pack("a3a3a3")   #=> "a\000\000b\000\000c\000\000"
n.pack("ccc")      #=> "ABC"

انظر أيضًا

  • التابع hash: يعيد قيمة Hash للمصفوفة التي استُدعيت معه.

مصادر