0

我正在从服务器传输数据。服务器发送各种 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;
}
4

2 回答 2

1

所以首先:

unsigned int UNSIGNED_BYTE;

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

第二:

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

正在将 8 位读入(可能)32 位内存位置,而放置 8 位的正确端并不取决于 C++(正如您在评论中所说)。这实际上取决于您的 CPU,因为字节序是 CPU 的属性而不是语言。您为什么不将值读入实际值char,然后简单地将其分配给 a,int因为这将为您处理转换并使您的代码可移植

于 2013-03-20T20:58:27.457 回答
-1

问题是,我没有初始化 int。虽然第 1 个字节发生了变化,但其他 3 个字节具有随机值。
这使得解决方案非常简单(并且也使我的问题很可能因为过于本地化而被关闭):

无符号整数 UNSIGNED_BYTE = 0;

于 2013-03-20T20:56:45.037 回答