Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将存储在缓冲区中的字节转换为变量?_C - Fatal编程技术网

C 如何将存储在缓冲区中的字节转换为变量?

C 如何将存储在缓冲区中的字节转换为变量?,c,C,因此,我从一个文件描述符中读取,它包含一个原始字节格式的int变量 所以我在做: char buffer[sizeof(int)]; ssize_t sizeOfFile = read(sock_fd, buffer, sizeof(int)); int extractedInt = ???; 如何将缓冲区转换为整数?我在考虑memcpy,但不知道是否有更好的方法 您可以直接读取整数 int extractedInt; ssize_t sizeOfFile = read(sock_fd, &

因此,我从一个文件描述符中读取,它包含一个原始字节格式的
int
变量

所以我在做:

char buffer[sizeof(int)];
ssize_t sizeOfFile = read(sock_fd, buffer, sizeof(int));

int extractedInt = ???;

如何将缓冲区转换为整数?我在考虑memcpy,但不知道是否有更好的方法

您可以直接读取整数

int extractedInt;
ssize_t sizeOfFile = read(sock_fd, &extractedInt, sizeof(int));
read
将读取整数字节的大小,并将其存储到
extractedInt

如果您的
int
实际上是要转换为
int
的文件中的一个字符串,则过程有点不同

#define SIZE 20

char buffer[SIZE]; // ensure there is enough space for a string containing an integer
ssize_t sizeOfFile = read(sock_fd, buffer, SIZE);

int extractedInt = atoi(buffer);  // convert string to integer

我可以从你的代码中猜出你正在从网络上阅读。因此,仅从缓冲区读取
int
是不可移植的,在您的网络协议中,您选择了特定的endianness,但您不能期望程序运行的所有平台都具有相同的endianness,因此这将导致错误的转换。 而其他建议的要求
read
返回
int
的解决方案也会导致同样的问题

因此,在您的情况下,我只能建议迭代您的数组,并根据平台的endianness,通过逐步将字节放置在正确的位置来计算整数

您可以使用GCC中的宏
\uuuuu BYTE\uu ORDER\uuuu
来检测构建目标平台的结束性

有一个网络数据是big-endian的示例:

// construct an `int` with the bytes in the given buffer
// considering the buffer contains the representation
// of an int in big endian
int buffer_to_int(char* buffer, int buffer_size) {
    int result = 0;
    int i;
    char sign = buffer[0] & 0x80;
    char * res_bytes = (char*)&result; // this pointer allows to access the int bytes
    int offset = sizeof(int) - buffer_size;

    if( sign != 0 )
        sign = 0xFF;

    if( offset < 0 ) {
        // not representable with a `int` type
        // we chose here to return the closest representable value
        if( sign == 0 ) { //positive
            return INT_MAX;
        } else {
            return INT_MIN;
        }
    }

#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    for(i=0; i<buffer_size; i++) {
        res_bytes[i] = buffer[buffer_size-i-1]; // invert the bytes
    }

    for(i=0; i<offset; i++){
        res_bytes[buffer_size+i] = sign;
    }
#else
    // same endianness, so simply copy bytes using memcpy
    memcpy(&result + offset, buffer, buffer_size);

    for(i=0; i<offset; i++){
        res_bytes[i] = sign;
    }
#endif

    return result;
}
//用给定缓冲区中的字节构造一个'int'
//考虑到缓冲区包含表示
//在big-endian中使用int
整数缓冲区到整数(字符*缓冲区,整数缓冲区大小){
int结果=0;
int i;
字符符号=缓冲区[0]&0x80;
char*res_bytes=(char*)&result;//此指针允许访问int字节
int offset=sizeof(int)-缓冲区大小;
如果(符号!=0)
符号=0xFF;
如果(偏移量<0){
//不能用'int'类型表示
//我们选择在这里返回最接近的可表示值
如果(符号==0){//正
返回INT_MAX;
}否则{
返回INT_MIN;
}
}
#如果(字节)顺序(字节)==(字节)顺序(小字节)__

对于(i=0;iYou可以直接读取一个int.或使用
char buffer[sizeof(int)]定义
union
int-value
成员。将文件加载到
缓冲区
,然后使用int
value
-使用此函数族通过网络进行通信。应注意,这需要输入的字节顺序与本地计算机的字节顺序相匹配。(网络协议中通常使用大端号。)此外,当我们知道接下来的四个字节包含一个
int
时,这也很好。这是OP要求的,但有时您会阅读整个数据包或其他消息,并对其进行分析,然后找出其中的
int
是您想要的。在这种情况下,
memcpy
解决方案很有用。完整的答案可能包括:去吧。