将int中的字节更改为整数

时间:2013-03-20 20:47:36

标签: c++ pointers casting int

我从服务器传输数据。服务器发送各种BigEndian变量,但也发送字节(表示数字)。我的SocketClient.read次重载之一接受(int length, char* array)。我想将一个整数变量指针传递给此函数,以便获取0-255值(无符号字节)。

我尝试了什么:

unsigned int UNSIGNED_BYTE;
socket.read(1, &((char*)&UNSIGNED_BYTE)[0]);  //I am changing 1st byte of a variable - C++ uses little endian
//I know that function reads 6, and that is what I find in 1st byte
std::cout<<(int)((char*)&UNSIGNED_BYTE)[0]<<")\n";  //6   - correct
std::cout<<UNSIGNED_BYTE<<")\n";  //3435973638   -What the hell?

根据以上所述,我正在更改int错误部分。但我应该改变什么

我的班级声明和实施:

/*Declares:*/
bool read(int bytes, char *text);
/*Implements:*/
bool SocketClient::read(int bytes, char *text) {
      //boost::system::error_code error;
      char buffer = 0;
      int length = 0;
      while(bytes>0) {
        try
        {
          size_t len = sock.receive(boost::asio::buffer(&buffer, 1));  //Read a byte to a buffer
        }
        catch(const boost::system::system_error& ex) {
            std::cout<<"Socket exception: "<<ex.code()<<'\n';
            return false;   //Happens when peer disconnects for example
        }
        if(byteEcho)
            std::cout<<(int)(unsigned char)buffer<<' ';
        bytes--;      //Decrease ammount to read
        text[length] = buffer;
        length++;

      }
      return true;
}

2 个答案:

答案 0 :(得分:1)

首先:

unsigned int UNSIGNED_BYTE;

可能不是很有名,因为我非常怀疑你使用的架构将int定义为8位无符号整数另外你没有将它初始化为零然后你只写了一部分,剩下的就是垃圾了。在大多数现代编译器/体系结构中,它的大小可能是32/64位。

其次:

socket.read(1, &((char*)&UNSIGNED_BYTE)[0])

将8位读入(可能)32位存储器位置,将8位读取的正确结束不是C ++(正如您在评论中所说)。它实际上取决于你的CPU,因为endianness是CPU的属性而不是语言。为什么不将该值读入实际char,然后将其分配给int,因为这将为您处理转换并使您的代码可移植

答案 1 :(得分:-1)

问题是,我没有初始化int 。虽然第一个字节已更改,但其他3个字节具有随机值 这使得解决方案非常简单(并且还使我的问题可能因太本地化而关闭):

unsigned int UNSIGNED_BYTE = 0;