POSIX `read()` 的 `buf` 应该是 `signed` 还是 `unsigned`?这有关系吗?
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
,如果那是写入文件的内容。
选择写入文件的任何类型,或者如果您正在读取任意字节,则选择最适合您以后处理的类型。
Does it matter if the actual buffer passed in is an array of char
s or unsigned char
s?
没有。此外,这些不是您唯一的选择。第二个参数指向的缓冲区可以有 any 对象类型。它指向 char
数组或 unsigned char
数组是相当常见的,但它指向某个(其他)整数类型的数组或结构对象的情况并不少见类型,或其他东西。
主要的objective是根据发送方想要的数据类型来解释接收到的数据,这需要您事先知道或者能够从数据中确定想要的类型。换句话说,发送方和接收方需要就某种通信协议达成一致。
最简单的协议是无差别的字节流;为此,unsigned char
数组是最合适的选择。其他一些选择更适合其他协议。
"read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf."
Read() 将从您的文件描述符(可以是文件、套接字或其他)存储 字节 。
字节将存储在您的指针地址,无论其类型如何。您的程序理解这些字节的方式取决于您声明它的方式。
因此,例如,相同的字节 0xFF 可能会在 buf 声明时被您的程序解释为 255 或 -1
来自 http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html:
The read()
function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes
, into the buffer pointed to by buf
.
如何解释字节由您决定。 buf
是 char
数组还是 unsigned char
数组对 read
的工作方式没有影响。只有您决定如何解释数据。如果文件中包含的数据不是 char
,如果将它们视为 char
的数组,您可能最终会误解其内容。这又取决于您的平台。
将数据解释为unsigned char
的数组也不一定正确。文件中的数据可能是 floats
的数组或包含混合数据类型的 struct
的数组。
底线 - 您需要将数据读入内存中适当的对象类型。为此,您必须知道文件中保存的内容。
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
,如果那是写入文件的内容。
选择写入文件的任何类型,或者如果您正在读取任意字节,则选择最适合您以后处理的类型。
Does it matter if the actual buffer passed in is an array of
char
s orunsigned char
s?
没有。此外,这些不是您唯一的选择。第二个参数指向的缓冲区可以有 any 对象类型。它指向 char
数组或 unsigned char
数组是相当常见的,但它指向某个(其他)整数类型的数组或结构对象的情况并不少见类型,或其他东西。
主要的objective是根据发送方想要的数据类型来解释接收到的数据,这需要您事先知道或者能够从数据中确定想要的类型。换句话说,发送方和接收方需要就某种通信协议达成一致。
最简单的协议是无差别的字节流;为此,unsigned char
数组是最合适的选择。其他一些选择更适合其他协议。
"read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf."
Read() 将从您的文件描述符(可以是文件、套接字或其他)存储 字节 。
字节将存储在您的指针地址,无论其类型如何。您的程序理解这些字节的方式取决于您声明它的方式。
因此,例如,相同的字节 0xFF 可能会在 buf 声明时被您的程序解释为 255 或 -1
来自 http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html:
The
read()
function shall attempt to read nbyte bytes from the file associated with the open file descriptor,fildes
, into the buffer pointed to bybuf
.
如何解释字节由您决定。 buf
是 char
数组还是 unsigned char
数组对 read
的工作方式没有影响。只有您决定如何解释数据。如果文件中包含的数据不是 char
,如果将它们视为 char
的数组,您可能最终会误解其内容。这又取决于您的平台。
将数据解释为unsigned char
的数组也不一定正确。文件中的数据可能是 floats
的数组或包含混合数据类型的 struct
的数组。
底线 - 您需要将数据读入内存中适当的对象类型。为此,您必须知道文件中保存的内容。