سؤال

هل هناك طريقة قياسية مقبولة ل 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 هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top