写磁盘时应该注意:
(引自短歌老大)直接fwrite并非不可以,只是可移植性太差。一般我们把数据写入文件都是为了进行数据交换,而直接把一个结构体用一次fwrite调用写入文件后是否可以再用一次fread正确读出取决于写入代码和读出代码编译时的字长、对齐逻辑和字节序等问题(这句话长点,大家凑合着看),严重影响可移植性。
把一个结构体写入文件时我觉得要注意以下几点:
1:要按不同域分别写入,以避免对齐方式的影响;
2:要设计好不同数据的长度,不要用sizeof来获得,以避免字长的影响;
3:要设计好字节顺序,每次写入一个字节,以避免 字节序的影响;
4:要存储逻辑结构而不是数据结构。比如当存储链表时按顺序存储数据读取时再重新组织为链表,而不要去考虑如何存储链接域。
写入网络好说了:
1)首先要清楚是否有机器位宽不一致的情况,如32位机和64位机。如果位宽不一致,则避免传输表示方 式 不一致的数据类型,如long、float型在32位了64位下表示方式不一致,会导致数据解析错误。
2)确认通信双方的对齐位宽一致,或自己保证传输的数据结构在对齐调整后不会产生大小不一致。如果收发 双方的对齐方式分别是按4和8字节对齐,则需要在程序中明确制定对齐位宽;或者调整数据的结构,确保在 对齐调整后,收/发的数据中每一项的偏移量一致。
3)尽量对发出去的数据都转换成网络字节序,接收后转换回本地字节序,特别是机器字节序不一致时,现有 的字节序转换函数不能满足所有需求。
4)某些数据类型的表示方式有不同,如浮点数(一般用IEEE 794标准),不能认为正确的传了一个字节序 正确的8字节double型就对了,不同平台对double型的表示方式不同,比如发送1.003,接受没问题,结果却 得到了其它的数值。
分享到:
相关推荐
在Python中,与C结构体交互的一个常见场景是在读写二进制文件,如原始的磁盘映像、网络协议数据包或硬件设备的通信。通过使用`struct`,你可以确保Python数据结构与底层系统的表示一致,这对于跨平台编程尤其重要。 ...
这类技术主要用于将复杂的结构化数据转换成二进制格式,以便于高效地存储到磁盘或在网络上传输。以下是对"结构体序列化读写二进制文件类"这一主题的详细解释。 首先,结构体(Struct)是C/C++编程语言中的一个基本...
`PersistentStorageSerializable`库正是为了解决这一问题而设计的,它提供了一种更简便的方式来序列化系统用户默认值或属性列表(Property List)文件,使其能够在磁盘上持久保存。 首先,我们来理解什么是序列化。...
然而,对于需要跨语言兼容性或网络传输的数据,可能需要考虑使用JSON或protobuf等标准化的序列化格式。此外,如果数据存储需要事务支持、版本控制或复杂的查询能力,那么更全面的数据库解决方案(如SQLite、MySQL或...
文件描述符是一个与打开的文件关联的整数,这里的“文件”不仅指存储在磁盘上的文件,还包括网络连接、命名管道、终端等。套接口是一种系统进程与文件描述符之间进行通信的方法。 #### 二、常见的套接口类型 - **...
- 使用函数如`pcap_open_live()`打开网络接口,`pcap_loop()`或`pcap_next()`捕获数据包,`pcap_compile()`和`pcap_setfilter()`设置过滤规则。 4. **WinPcap API** - `pcap_open_live()`: 打开一个网络接口,...
14. **sk_buff**:在网络协议栈中,sk_buff(socket buffer)用于封装网络数据包,实现协议层之间的数据传输。 15. **sock** 和 **socket**:sock数据结构包含了特定协议的BSD套接字信息,而socket结构则作为VFS...
套接口不仅用于与磁盘上的文件交互,还可以处理网络连接、命名管道、终端等不同类型的通信。 网络编程主要涉及两种类型的套接口:字节流套接口(基于TCP)和数据报套接口(基于UDP)。字节流套接口(SOCK_STREAM)...
`sar` 命令是系统活动报告(System Activity Reporter)的一部分,它是 `sysstat` 软件包中的一个工具,用于收集和显示Linux系统的性能数据,包括CPU使用率、磁盘I/O、内存使用以及网络活动等。在描述中提到了与网络...
- **文件描述符**:这是一个与打开文件相关联的整数,这里的文件可以指网络连接、FIFO(先进先出缓冲区)、管道、终端、磁盘上的真实文件等。 - **Socket创建**:通过系统调用`socket()`创建套接字,这会返回一个...
与之相比,字符设备则更倾向于处理没有固定长度限制的数据流,如终端设备或网络接口。 块设备驱动程序的工作原理涉及到几个核心概念和技术,其中包括请求队列机制、分层实现以及为了提高性能而采用的各种优化措施。...
Unix系统中的每一个I/O操作都是通过对文件描述符的操作来完成的,这些文件描述符可以指向多种类型的资源,如磁盘文件、管道、网络连接等。因此,在网络通信中,socket就是一种特殊的文件描述符,它使得进程能够与...
它是一个文件描述符,但这个文件可能是一个网络连接、FIFO、管道、终端、磁盘上的文件或者其他的东西。Unix 中所有的东西是文件!因此,你想和 Internet 上其他程序通讯的时候,你将要通过文件描述符。 Internet 套...
此外,不同类型的设备(如串口和 IDE 磁盘)对缓存刷新的响应速度不同,串口设备通常对数据传输速率不敏感,而 IDE 磁盘则需要更快的刷新速度。因此,通过 kseg0 访问设备可能导致数据一致性问题,且对并行设备和...
- **次设备号**(Minor Device Number):用于区分同一类型设备的不同实例,例如不同的磁盘分区。 #### 设备驱动程序开发基础 开发Linux设备驱动程序需要熟悉C语言和Linux内核API。以下是一个简单的字符设备驱动...
例如,读扇区的控制代码为`IOCTL_DISK_READ_DRIVE_MEDIA`,写扇区为`IOCTL_DISK_WRITE_DRIVE_MEDIA`。 ```cpp bool ReadSector(HANDLE hDevice, SectorOperation& operation) { OVERLAPPED overlapped = {0}; ...
在 DOS(磁盘操作系统)环境下进行网络编程是一项非常具有挑战性的任务,尤其是在现代网络应用已经高度发达的今天。不过,对于深入理解计算机底层原理及网络通信机制而言,这仍然具有不可替代的价值。 根据提供的...
从给定的文件信息来看,这里涉及的是C语言在DOS环境下的系统调用和文件操作函数,这些函数主要用于处理磁盘操作、内存管理和中断处理等底层任务。下面将详细解释其中的一些关键知识点: ### 1. 系统调用与磁盘操作 ...
在网络通信中,为了确保不同字节序的机器之间能够正确传输数据,通常会采用网络字节序进行转换。 **3. 地址族(Address Family)** 地址族定义了套接口地址的类型,例如 AF_INET 表示 IPv4 地址族,AF_INET6 表示 ...
### C/C++语言网络开发详解 #### 一、引言 在计算机科学领域,网络编程是连接不同系统间通信的关键技术之一。C 和 C++ 作为底层编程语言,在网络编程中占据着重要的地位。本篇文章将详细介绍 C 语言在网络编程中的...