0

サーバーからデータをストリーミングしています。サーバーはさまざまな BigEndian 変数を送信しますが、バイト (数値を表す) も送信します。私のSocketClient.readオーバーロードの 1 つは受け入れます(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;

intあなたが使用しているアーキテクチャが8ビットの符号なし整数として定義されていることを非常に疑っているので、おそらくあまり役​​に立たない名前ですゴミとして。ほとんどの最新のコンパイラ/アーキテクチャでは、サイズが 32/64 ビットになる可能性があります。

第二に:

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

(おそらく)32ビットのメモリ位置に8ビットを読み込んでおり、8ビットを配置する正しい終わりはC ++ではありません(コメントで述べているように)。エンディアンは言語ではなくCPUのプロパティであるため、実際にはCPUにかかっています。char値を実際に読み取ってから、単純に に代入しないのはなぜですか。intこれにより、変換が処理され、コードが移植可能になります

于 2013-03-20T20:58:27.457 に答える
-1

問題は、 int を初期化しなかったことです。1 バイト目は変更されていますが、他の 3 バイトはランダムな値になっています。これにより、ソリューションが非常にシンプルになります(また、私の質問がToo localized
として閉じられる可能性が高くなります):

unsigned int UNSIGNED_BYTE = 0;

于 2013-03-20T20:56:45.037 に答える