[英]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
。
如何解释字节取决于您。 无论您的buf
是char
数组还是unsigned char
都不会影响read
的工作。 只有您决定如何解释数据。 如果文件中包含的数据不是char
,则如果将它们视为char
数组,则可能最终会误解其内容。 这又取决于您的平台。
将数据解释为unsigned char
数组也不一定正确。 文件中的数据可能是floats
或包含混合数据类型的struct
数组。
底线-您需要将数据读取到内存中适当的对象类型中。 为此,您必须知道文件中保存了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.