web-dev-qa-db-ja.com

2バイトを整数に変換します

ポート番号を2バイト(最下位バイトが最初)として受け取り、それを整数に変換して操作できるようにしたいと考えています。私はこれを作りました:

char buf[2]; //Where the received bytes are

char port[2];

port[0]=buf[1]; 

port[1]=buf[0];

int number=0;

number = (*((int *)port));

しかし、正しいポート番号を取得できないため、何か問題があります。何か案は?

14
user1367988

ポート番号を2バイトとして受け取ります(最下位バイトが最初)。

その後、これを行うことができます:

  int number = buf[0] | buf[1] << 8;
23
nos

Bufをunsigned char buf[2]にすると、単純化して単純化することができます。

number = (buf[1]<<8)+buf[0];
6

これはすでに合理的に回答されていることを感謝します。ただし、別の方法は、コード内にマクロを定義することです。例:

// bytes_to_int_example.cpp
// Output: port = 514

// I am assuming that the bytes the bytes need to be treated as 0-255 and combined MSB -> LSB

// This creates a macro in your code that does the conversion and can be tweaked as necessary
#define bytes_to_u16(MSB,LSB) (((unsigned int) ((unsigned char) MSB)) & 255)<<8 | (((unsigned char) LSB)&255) 
// Note: #define statements do not typically have semi-colons
#include <stdio.h>

int main()
{
  char buf[2];
  // Fill buf with example numbers
  buf[0]=2; // (Least significant byte)
  buf[1]=2; // (Most significant byte)
  // If endian is other way around swap bytes!

  unsigned int port=bytes_to_u16(buf[1],buf[0]);

  printf("port = %u \n",port);

  return 0;
}
4
Pitpat
char buf[2]; //Where the received bytes are
int number;
number = *((int*)&buf[0]);

&buf[0]はbufの最初のバイトのアドレスを取ります。
(int*)を整数ポインタに変換します。
一番左*は、そのメモリアドレスから整数を読み取ります。

エンディアンを交換する必要がある場合:

char buf[2]; //Where the received bytes are
int number;  
*((char*)&number) = buf[1];
*((char*)&number+1) = buf[0];
0
mcgurk