मैं तारों को स्टोर करने के लिए एक बाइनरी फ़ाइल प्रारूप तैयार कर रहा हूं [अंतरिक्ष को बचाने के लिए शून्य को समाप्त किए बिना] और बाइनरी डेटा।बाइनरी फ़ाइल प्रारूप में पोर्टेबिलिटी समस्याओं को कैसे संभालें
i। छोटे/बड़े एंडियन सिस्टम से निपटने का सबसे अच्छा तरीका क्या है? i.a सब कुछ नेटवर्क बाइट ऑर्डर में परिवर्तित कर देगा और वापस ntohl()/htonl() काम के साथ?
ii। क्या पैक किए गए ढांचे x86, x64 और arm पर समान आकार होंगे?
iii। क्या इस दृष्टिकोण के साथ उनकी कोई अंतर्निहित कमजोरी है? मैं प्रारूप विकसित का उपयोग कर रहा
struct __attribute__((packed)) Header {
uint8_t magic;
uint8_t flags;
};
struct __attribute__((packed)) Record {
uint64_t length;
uint32_t crc;
uint16_t year;
uint8_t day;
uint8_t month;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t type;
};
परीक्षक कोड:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <strings.h>
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
struct __attribute__((packed)) Header {
uint8_t magic;
uint8_t flags;
};
struct __attribute__((packed)) Record {
uint64_t length;
uint32_t crc;
uint16_t year;
uint8_t day;
uint8_t month;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t type;
};
int main(void)
{
int fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT, 444);
struct Header header = {1, 0};
write(fd, &header, sizeof(header));
char msg[] = {"BINARY"};
struct Record record = {strlen(msg), 0, 0, 0, 0, 0, 0, 0};
write(fd, &record, sizeof(record));
write(fd, msg, record.length);
close(fd);
fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT, 444);
read(fd, &header, sizeof(struct Header));
read(fd, &record, sizeof(struct Record));
int len = record.length;
char c;
while (len != 0) {
read(fd, &c, 1);
len--;
printf("%c", c);
}
close(fd);
}
मैं बंद करने के लिए मतदान कर रहा हूं, एसओ क्षमा के लिए बहुत व्यापक है, एक अलग साइट आज़माएं! – Olaf
@ ओलाफ: मैं रखने के लिए वोट दूंगा: यह एक बहुत व्यावहारिक असली दुनिया का सवाल है जो हर समय आता है। सिर्फ इसलिए कि इसमें एक भी कट-एंड-सूखे उत्तर नहीं है इसका मतलब यह नहीं है कि यह विचार के लायक नहीं है। (इसके साथ ही, मैं नियमित रूप से नियमित नहीं हूं, इसलिए यदि सर्वसम्मति यह है कि व्यावहारिक, असली दुनिया प्रोग्रामिंग प्रश्नों के कुछ स्वार्थ हैं कि यह साइट _not_ है, तो मुझे बहस करने की कोई स्थिति नहीं है।) –
@SteveSummit: मैं वास्तव में इस बात से सहमत हूं कि प्रश्न वास्तव में दिलचस्प है (दिमाग मेरी "क्षमा करें")। हालांकि, यह एसओ के लिए ऑफ-विषय है। मुझे उम्मीद है कि ओपी को एक और साइट मिल जाएगी (यकीन नहीं है, अगर स्टैक एक्सचेंज पर कोई है)। वोट के लिए: अच्छा, यह स्पष्ट रूप से _my_ राय है। अगर दूसरे अलग सोचते हैं, तो यह खुले रहेंगे। में इसके साथ जी सकता हूँ। – Olaf