使用C++; 我试图用C++将4字节转换成整数。
这是我的代码:使用C++; 我试图用C++将4字节转换成整数。,c++,C++,这是我的代码: int buffToInteger(char * buffer) { int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]); return a; } int buffToInteger(字符*缓冲区) { int a=(int)(buffer[0]在表达式buffer[0]中,您的buffer包含有符号字符。因此,实际上,bu
int buffToInteger(char * buffer)
{
int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]);
return a;
}
int buffToInteger(字符*缓冲区)
{
int a=(int)(buffer[0]在表达式buffer[0]中,您的buffer
包含有符号字符。因此,实际上,buffer[0]=-29
,在转换为int
时,符号扩展到0xfffffff3
,反过来(0x3e在移位中有符号整数的隐式提升。
这是因为char(显然)是在您的平台上签名的(常见的事情),并且
这将获取一个缓冲区引用,将其类型转换为int引用,然后取消引用。我认为这也可以通过使用memcpy来实现:
int buffToInteger(char* buffer)
{
int a;
memcpy( &a, buffer, sizeof( int ) );
return a;
}
这比原始文章中提到的示例要快得多,因为它只按“原样”处理所有字节,不需要执行任何操作,如位移位等。
它也不会导致任何有符号-无符号问题。“。代码不会按预期工作”:您的代码确实按预期工作(因为我希望这种行为具有有符号字节值)。@Jongware为什么返回FFFFFF E1而不是16102?您能解释一下吗?@i486问题不在Endian中。@TonyD:这不对。(但您正在寻找正确的邻居。)这不是未定义的行为吗?据我所知,(unsigned char)(buffer[0])的结果类型它还可以将4字节转换为无符号整数吗?还是需要修改?@atari83除了返回值和函数内部的明显变化外,它应该可以。它只取决于表示包含无符号整数的小端数组的字符。嗨,Mylotyrena,欢迎使用堆栈溢出!请明白为什么你的代码能解决这个问题。这可能会导致尾数问题,因为字节可以是小尾数顺序,整数可以是大尾数顺序。
#include <iostream>
#include <iomanip>
int buffToInteger(char * buffer)
{
int a = static_cast<int>(static_cast<unsigned char>(buffer[0]) << 24 |
static_cast<unsigned char>(buffer[1]) << 16 |
static_cast<unsigned char>(buffer[2]) << 8 |
static_cast<unsigned char>(buffer[3]));
return a;
}
int main(void) {
char buff[4]={0x0,0x0,0x3e,static_cast<char>(0xe3)};
int a=buffToInteger(buff);
std::cout<<std::hex<<a<<std::endl;
// your code goes here
return 0;
}
char buffer[4];
int a;
a = *(int*)&buffer;
int buffToInteger(char* buffer)
{
int a;
memcpy( &a, buffer, sizeof( int ) );
return a;
}