الفرق بين المراجعتين لصفحة: «Ruby/String/unpack»
جميل-بيلوني (نقاش | مساهمات) إنشاء الصفحة. هذه الصفحة من مساهمات "كريم حبال". |
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby String]] | [[تصنيف: Ruby String]] | ||
يفك التابع <code>unpack</code> ترميز السلسلة النصية التي استدعي معها (والتي قد تحوي بيانات ثنائية) وفقًا إلى سلسلة التنسيق المعطاة، ويعيد مصفوفة من كل قيمة مستخرجة. | |||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">unpack(format) → anArray</syntaxhighlight> | <syntaxhighlight lang="ruby">unpack(format) → anArray</syntaxhighlight> | ||
== المعاملات == | |||
=== <code>format</code> === | |||
سلسلة نصية تمثِّل سلسلة التنسيق. تتكون سلسلة التنسيق من سلسلة من الموجهات ذات المحارف الفردية (اطلع على الجدول الآتي). يمكن أن يعقب كل موجِّه عددٌ يشير إلى عدد مرات تكرار هذا الموجه. سيستعمل الرمز * كل العناصر المتبقية. يمكن أن يلي كل موجه من الموجهات sSiIlL شرطة سفلية أو إشارة تعجب لاستعمال الحجم الأصلي للمنصة المُشِّغلة للنوع المُحدَّد؛ خلا ذلك، سيُستخدَم حجم ثابت مستقل عن المنصة. يجري تجاهل المسافات الفارغة في سلسلة التنسيق هذه. | |||
يختصر الجدول التالي مختلف التنسيقات مع أصناف روبي المعادة لكل منها: | |||
{| class="wikitable" | |||
!موجهات من النوع Integer | |||
!الصنف المعاد | |||
!شرح | |||
|- | |||
|<code>C</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 8 بايتات عديمة الإشارة (8-bit unsigned). | |||
|- | |||
|<code>S</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 16 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint16_t)). | |||
|- | |||
|<code>L</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 32 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint32_t)). | |||
|- | |||
|<code>Q</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 64 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint64_t)). | |||
|- | |||
|<code>J</code> | |||
|<code>Integer</code> | |||
|عرض المؤشر عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uintptr_t)). | |||
متاح منذ Ruby 2.3. | |||
|- | |||
| colspan="3" | | |||
|- | |||
|c | |||
|<code>Integer</code> | |||
|عدد بحجم 8 بايتات ذات إشارة (8-bit signed). | |||
|- | |||
|<code>s</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 16 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int16_t)). | |||
|- | |||
|<code>l</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 32 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int32_t)). | |||
|- | |||
|<code>q</code> | |||
|<code>Integer</code> | |||
|عدد بحجم 16 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int64_t)). | |||
|- | |||
|<code>j</code> | |||
|<code>Integer</code> | |||
|عرض المؤشر ذي الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات intptr_t)). | |||
متاح منذ Ruby 2.3. | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
|<code>S_ S!</code> | |||
|<code>Integer</code> | |||
|عدد صغير عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (unsigned short, native endian). | |||
|- | |||
|<code>I I_ I!</code> | |||
|<code>Integer</code> | |||
|عدد صحيح عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (unsigned int, native endian). | |||
|- | |||
|<code>L_ L!</code> | |||
|<code>Integer</code> | |||
|عدد كبير عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (unsigned long, native endian). | |||
|- | |||
|<code>Q_ Q!</code> | |||
|<code>Integer</code> | |||
|عدد كبير جدًا عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (unsigned long long, native endian). | |||
يطلق الخطأ <code>ArgumentError</code> في حال لم يكن في المنصة النوع <code>long long</code>. | |||
متاح منذ Ruby 2.1. | |||
|- | |||
|<code>J!</code> | |||
|<code>Integer</code> | |||
|عرض المؤشر عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (مثل الموجه <code>J</code>). | |||
متاح منذ Ruby 2.3. | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
|<code>s_ s!</code> | |||
|<code>Integer</code> | |||
|عدد صغير ذو إشارة، مع اعتماد الترتيب الطبيعي للبايتات (signed short, native endian). | |||
|- | |||
|<code>i i_ i!</code> | |||
|<code>Integer</code> | |||
|عدد صحيح ذو إشارة، مع اعتماد الترتيب الطبيعي للبايتات (signed int, native endian). | |||
|- | |||
|<code>l_ l!</code> | |||
|<code>Integer</code> | |||
|عدد كبير بإشارة، مع اعتماد الترتيب الطبيعي للبايتات (signed long, native endian). | |||
|- | |||
|<code>q_ q!</code> | |||
|<code>Integer</code> | |||
|عدد كبير جدًا ذو إشارة، مع اعتماد الترتيب الطبيعي للبايتات (signed long long, native endian). | |||
يطلق الخطأ <code>ArgumentError</code> في حال لم يكن في المنصة النوع <code>long long</code>. | |||
متاح منذ Ruby 2.1 | |||
|- | |||
|<code>j!</code> | |||
|<code>Integer</code> | |||
|عرض المؤشر ذي الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (مثل <code>j</code>). | |||
متاح منذ Ruby 2.3. | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
|<code>S> s> S!> s!></code><code>L> l> L!> l!></code> | |||
<code>I!> i!> </code> | |||
<code>Q> q> Q!> q!></code> | |||
<code>J> j> J!> j!></code> | |||
|<code>Integer</code> | |||
|مثل الموجهات التي لا تحتوي "<"، باستثناء كون البايتات الأقل أهمية مخزنة أولًا (big endian). | |||
إن <code>I!> i!></code> متاحة منذ Ruby 1.9.3. | |||
"<code>S></code>" مثله مثل "<code>n</code>" | |||
"<code>L></code>" مثله مثل "<code>N</code>" | |||
|- | |||
|<code>S< s< S!< s!<</code><code>L< l< L!< l!<</code> | |||
<code>I!< i!<</code> | |||
<code>Q< q< Q!< q!<</code> | |||
<code>J< j< J!< j!<</code> | |||
|<code>Integer</code> | |||
|مثل الموجهات التي لا تحتوي ">"، باستثناء كون البايتات الأكثر أهمية مخزنة أولًا (little endian). | |||
إن <code>I!< i!<</code> متاحة منذ Ruby 1.9.3. | |||
"<code>S<</code>" مثله مثل "<code>v</code>" | |||
"<code>L<</code>" مثله مثل "<code>V</code>" | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
|n | |||
|<code>Integer</code> | |||
|عدد بحجم 16 بت عديم الإشارة، ترتيب بايت شبكي (network byte order، أي البايت الأكثر أهمية مخزَّن أولًا [big-endian]). | |||
|- | |||
|N | |||
|<code>Integer</code> | |||
|عدد بحجم 32 بت عديم الإشارة، ترتيب بايت شبكي (network byte order، أي البايت الأكثر أهمية مخزَّن أولًا [big-endian]). | |||
|- | |||
|v | |||
|<code>Integer</code> | |||
|عدد بحجم 16 بت عديم الإشارة، ترتيب البايت بحسب VAX (أي VAX byte order، البايت الأقل أهمية مخزَّن أولًا [little-endian]). | |||
|- | |||
|V | |||
|<code>Integer</code> | |||
|عدد بحجم 32 بت عديم الإشارة، ترتيب البايت بحسب VAX (أي VAX byte order، البايت الأقل أهمية مخزَّن أولًا [little-endian]). | |||
|- | |||
| colspan="3" | | |||
|- | |||
!موجهات من النوع 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 order). | |||
|- | |||
|<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). | |||
|- | |||
| colspan="3" | | |||
|- | |||
!موجهات من النوع String | |||
!عناصر المصفوفة | |||
!شرح | |||
|- | |||
|<code>A</code> | |||
|<code>String</code> | |||
|سلسلة نصية ثنائية عشوائية ( حذف المحارف null الزائدة والمسافات الفارغة المرمزة بترميز ASCII ). | |||
|- | |||
|<code>a</code> | |||
|<code>String</code> | |||
|سلسلة نصية ثنائية عشوائية. | |||
|- | |||
|<code>Z</code> | |||
|<code>String</code> | |||
|سلسلة نصية تنتهي بالمحرف null. | |||
|- | |||
|<code>B</code> | |||
|<code>String</code> | |||
|سلسلة نصية من البتات (bit string) البتات الأكثر أهمية أولًا. | |||
|- | |||
|<code>b</code> | |||
|<code>String</code> | |||
|سلسلة نصية من البتات (bit string) البتات الأقل أهمية أولًا. | |||
|- | |||
|<code>H</code> | |||
|<code>String</code> | |||
|سلسلة نصية ست عشرية (البايت العلوي [high nibble] أولًا). | |||
|- | |||
|<code>h</code> | |||
|<code>String</code> | |||
|سلسلة نصية ست عشرية (البايت السفلي [low nibble] أولًا). | |||
|- | |||
|<code>u</code> | |||
|<code>String</code> | |||
|سلسلة نصية مُرمّزة بالترميز UU. | |||
|- | |||
|<code>M</code> | |||
|<code>String</code> | |||
|ترميز MIME مقتبس قابل للطباعة (quoted-printable, MIME encoding). اطلع على RFC2045. | |||
|- | |||
|<code>m</code> | |||
|<code>String</code> | |||
|سلسلة نصية مُرمّز بالترميز base64 (انظر RFC 2045) (الافتراضي) | |||
سلسلة نصية مرمزة بالترميز base64 (انظر RFC 4648) إن اتبِعَت بصفر 0. | |||
|- | |||
|<code>P</code> | |||
|<code>String</code> | |||
|مؤشر لبنية (pointer to a structure، سلسلة نصية ذات طول ثابت) | |||
|- | |||
|<code>p</code> | |||
|<code>String</code> | |||
|مؤشر لسلسة نصية تنتهي بالقيمة <code>null</code> (null-terminated string). | |||
|- | |||
| colspan="3" | | |||
|- | |||
!موجهات من النوع Misc | |||
!عناصر المصفوفة | |||
!شرح | |||
|- | |||
|<code>@</code> | |||
|<code>String</code> | |||
|التخطي للموضع المعطى عبر المعامل <code>length</code>. | |||
|- | |||
|<code>X</code> | |||
|<code>String</code> | |||
|التخطي للخلف (backward) بايت واحد. | |||
|- | |||
|<code>x</code> | |||
|<code>String</code> | |||
|التخطي للأمام بايت واحد. | |||
|} | |||
==القيمة المعادة== | ==القيمة المعادة== | ||
يعاد | يعاد |
مراجعة 21:23، 27 مارس 2019
يفك التابع unpack
ترميز السلسلة النصية التي استدعي معها (والتي قد تحوي بيانات ثنائية) وفقًا إلى سلسلة التنسيق المعطاة، ويعيد مصفوفة من كل قيمة مستخرجة.
البنية العامة
unpack(format) → anArray
المعاملات
format
سلسلة نصية تمثِّل سلسلة التنسيق. تتكون سلسلة التنسيق من سلسلة من الموجهات ذات المحارف الفردية (اطلع على الجدول الآتي). يمكن أن يعقب كل موجِّه عددٌ يشير إلى عدد مرات تكرار هذا الموجه. سيستعمل الرمز * كل العناصر المتبقية. يمكن أن يلي كل موجه من الموجهات sSiIlL شرطة سفلية أو إشارة تعجب لاستعمال الحجم الأصلي للمنصة المُشِّغلة للنوع المُحدَّد؛ خلا ذلك، سيُستخدَم حجم ثابت مستقل عن المنصة. يجري تجاهل المسافات الفارغة في سلسلة التنسيق هذه.
يختصر الجدول التالي مختلف التنسيقات مع أصناف روبي المعادة لكل منها:
موجهات من النوع Integer | الصنف المعاد | شرح |
---|---|---|
C
|
Integer
|
عدد بحجم 8 بايتات عديمة الإشارة (8-bit unsigned). |
S
|
Integer
|
عدد بحجم 16 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint16_t)). |
L
|
Integer
|
عدد بحجم 32 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint32_t)). |
Q
|
Integer
|
عدد بحجم 64 بت عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uint64_t)). |
J
|
Integer
|
عرض المؤشر عديم الإشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات uintptr_t)).
متاح منذ Ruby 2.3. |
c | Integer
|
عدد بحجم 8 بايتات ذات إشارة (8-bit signed). |
s
|
Integer
|
عدد بحجم 16 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int16_t)). |
l
|
Integer
|
عدد بحجم 32 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int32_t)). |
q
|
Integer
|
عدد بحجم 16 بت ذو إشارة، مع اعتماد الترتيب الطبيعي (native endian) للبايتات int64_t)). |
j
|
Integer
|
عرض المؤشر ذي الإشارة، مع اعتماد الترتيب الطبيعي (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).
يطلق الخطأ متاح منذ Ruby 2.1. |
J!
|
Integer
|
عرض المؤشر عديم الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (مثل الموجه 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
|
عدد كبير جدًا ذو إشارة، مع اعتماد الترتيب الطبيعي للبايتات (signed long long, native endian).
يطلق الخطأ متاح منذ Ruby 2.1 |
j!
|
Integer
|
عرض المؤشر ذي الإشارة، مع اعتماد الترتيب الطبيعي للبايتات (مثل j ).
متاح منذ Ruby 2.3. |
S> s> S!> s!> L> l> L!> l!>
|
Integer
|
مثل الموجهات التي لا تحتوي "<"، باستثناء كون البايتات الأقل أهمية مخزنة أولًا (big endian).
إن " " |
S< s< S!< s!< L< l< L!< l!<
|
Integer
|
مثل الموجهات التي لا تحتوي ">"، باستثناء كون البايتات الأكثر أهمية مخزنة أولًا (little endian).
إن " " |
n | Integer
|
عدد بحجم 16 بت عديم الإشارة، ترتيب بايت شبكي (network byte order، أي البايت الأكثر أهمية مخزَّن أولًا [big-endian]). |
N | Integer
|
عدد بحجم 32 بت عديم الإشارة، ترتيب بايت شبكي (network byte order، أي البايت الأكثر أهمية مخزَّن أولًا [big-endian]). |
v | Integer
|
عدد بحجم 16 بت عديم الإشارة، ترتيب البايت بحسب VAX (أي VAX byte order، البايت الأقل أهمية مخزَّن أولًا [little-endian]). |
V | Integer
|
عدد بحجم 32 بت عديم الإشارة، ترتيب البايت بحسب VAX (أي VAX byte order، البايت الأقل أهمية مخزَّن أولًا [little-endian]). |
موجهات من النوع Float | عناصر المصفوفة | شرح |
D d
|
Float
|
عدد عشري مضاعف، مع اعتماد الترتيب الطبيعي للبايتات (double-precision, native format). |
F f
|
Float
|
عدد عشري، مع اعتماد الترتيب الطبيعي للبايتات (single-precision, native format). |
E
|
Float
|
عدد عشري مضاعف، مع ترتيب البايتات الأكثر أهمية أولًا (double-precision, little-endian byte order). |
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
|
String
|
سلسلة نصية ثنائية عشوائية ( حذف المحارف null الزائدة والمسافات الفارغة المرمزة بترميز ASCII ). |
a
|
String
|
سلسلة نصية ثنائية عشوائية. |
Z
|
String
|
سلسلة نصية تنتهي بالمحرف null. |
B
|
String
|
سلسلة نصية من البتات (bit string) البتات الأكثر أهمية أولًا. |
b
|
String
|
سلسلة نصية من البتات (bit string) البتات الأقل أهمية أولًا. |
H
|
String
|
سلسلة نصية ست عشرية (البايت العلوي [high nibble] أولًا). |
h
|
String
|
سلسلة نصية ست عشرية (البايت السفلي [low nibble] أولًا). |
u
|
String
|
سلسلة نصية مُرمّزة بالترميز UU. |
M
|
String
|
ترميز MIME مقتبس قابل للطباعة (quoted-printable, MIME encoding). اطلع على RFC2045. |
m
|
String
|
سلسلة نصية مُرمّز بالترميز base64 (انظر RFC 2045) (الافتراضي)
سلسلة نصية مرمزة بالترميز base64 (انظر RFC 4648) إن اتبِعَت بصفر 0. |
P
|
String
|
مؤشر لبنية (pointer to a structure، سلسلة نصية ذات طول ثابت) |
p
|
String
|
مؤشر لسلسة نصية تنتهي بالقيمة null (null-terminated string).
|
موجهات من النوع Misc | عناصر المصفوفة | شرح |
@
|
String
|
التخطي للموضع المعطى عبر المعامل length .
|
X
|
String
|
التخطي للخلف (backward) بايت واحد. |
x
|
String
|
التخطي للأمام بايت واحد. |
القيمة المعادة
يعاد
أمثلة
مثال على استعمال التابع unpack
:
"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "]
"aa".unpack('b8B8') #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c') #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534]
"now=20is".unpack('M*') #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"]