繁体   English   中英

POSIX`read()`的`buf`应该被签名还是未签名? 有关系吗

[英]Should POSIX `read()`'s `buf` be `signed` or `unsigned`? Does it even matter?

POSIX读取功能定义为ssize_t read(int fd, void *buf, size_t count); ,将其buf参数设为void*

传入的实际缓冲区是char数组还是unsigned char数组有关系吗? 如果是这样,我应该使用哪一个? 我用谷歌搜索并阅读了那个人,但是甚至没有提到缓冲区的类型 ,更不用说它的签名了。

声明为void *的原因是,您几乎可以读取任何类型。 你可以读一个char 您可以阅读unsigned char 如果您先前写入文件的内容也是int ,则可以读取int 您可以读取struct div_t ,如果已将其写入文件。

选择写入文件的任何类型,或者读取任意字节,无论哪种类型最适合以后的处理。

传入的实际缓冲区是char数组还是unsigned char数组有关系吗?

不。而且,这些不是您唯一的选择。 第二个自变量指向的缓冲区可以具有任何对象类型。 指向一个char数组或一个unsigned char数组是很普遍的,但指向某个(其他)整数类型的数组,一个结构类型的对象或其他东西并不罕见。

主要目的是根据发送方预期的数据类型来解释接收到的数据,这要求您要么事先知道,要么能够从数据中确定预期的数据类型。 换句话说,发送方和接收方需要就某种通信协议达成共识。

可能的最简单协议是未区分的字节流。 为此, unsigned char数组是最合适的选择。 其他一些选择更适合其他协议。

“ read()尝试从文件描述符fd读取总数以字节为单位的缓冲区,从buf开始。”

Read()将存储文件描述符中的字节 (文件,套接字或其他内容)。

字节将存储在指针地址中,无论其类型如何。 程序理解这些字节的方式取决于声明方式。

因此,例如,在buf声明时,程序可能会将同一字节0xFF解释为255或-1

http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html

read()函数应尝试从与打开的文件描述符fildes关联的文件中读取nbyte字节到buf

如何解释字节取决于您。 无论您的bufchar数组还是unsigned char都不会影响read的工作。 只有您决定如何解释数据。 如果文件中包含的数据不是char ,则如果将它们视为char数组,则可能最终会误解其内容。 这又取决于您的平台。

将数据解释为unsigned char数组也不一定正确。 文件中的数据可能是floats或包含混合数据类型的struct数组。

底线-您需要将数据读取到内存中适当的对象类型中。 为此,您必须知道文件中保存了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM