Uuids و byte- تبديل عبر الشبكة
-
19-09-2019 - |
سؤال
هل هناك طريقة قياسية مقبولة ل Byte-Swap Uuids للإرسال عبر شبكة (أو تخزين الملفات)؟ (أريد إرسال / تخزين البايتات الخوالي 16 بدلا من تحويل UUID إلى تمثيل سلسلة.)
اعتقدت في البداية أنني يجب أن أقسم UUID إلى 42 بت الأعداد الصحيحة واستدعاء Htonl على كل واحد منهم، ولكن هذا لم يشم رائحته مباشرة. لدى UIID هيكل داخلي (من RFC 4122):
typedef struct {
unsigned32 time_low;
unsigned16 time_mid;
unsigned16 time_hi_and_version;
unsigned8 clock_seq_hi_and_reserved;
unsigned8 clock_seq_low;
byte node[6];
} uuid_t;
هل سيكون صحيحا للقيام به:
...
uuid.time_low = htonl( uuid.time_low );
uuid.time_mid = htons( uuid.time_mid );
uuid.time_hi_and_version = htons( uuid.time_high_and_version );
/* other fields are represented as bytes and shouldn't be swapped */
....
قبل الكتابة، ثم CorrePsonding Ntoh ... يدعو بعد القراءة في الطرف الآخر؟
شكرًا.
المحلول
نعم، هذا هو الشيء الصحيح الذي يجب القيام به.
كل رقم (time_low
, time_mid
, time_hi_and_version
) عرضة ل byte النظام. ال node
الحقل ليس كذلك. clock_seq_hi_and_reserved
و clock_seq_low
تخضع أيضا للطلب البايت، لكنهم كل بايت واحد، لذلك لا يهم.
بالطبع، الأمر متروك لك للتأكد من اختيار الطلب المناسب على كلا الطرفين، أو فهم ما هو الطلب في الطرف الآخر إذا كنت لا تتحكم فيه. تستخدم مايكروسوفت بالطبع نبيذ صغير ل Uuids بهم. يمكنك رؤية تعريف Microsoft Uuid هنا.