2013-06-12 76 views
9

Tôi nhận được số cổng là 2 byte (ít nhất là byte quan trọng đầu tiên) và tôi muốn chuyển đổi số đó thành số nguyên để tôi có thể làm việc với số đó. Tôi đã thực hiện điều này:Chuyển đổi 2 byte thành số nguyên

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)); 

Tuy nhiên, có điều gì đó sai vì tôi không nhận được số cổng chính xác. Bất kỳ ý tưởng?

+0

là tính cuối cùng của bạn không? –

+1

cũng 2 byte so với 4 byte: ngắn so với int –

+1

sử dụng uint16_t để làm dàn diễn viên –

Trả lời

18

tôi nhận được một số cổng là 2 byte (byte trọng số thấp nhất đầu tiên)

Sau đó bạn có thể làm điều này:

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

Chính xác, cảm ơn rất nhiều! – user1367988

+2

@ user1367988 Chỉ cần hãy cẩn thận trong trường hợp 'char' được ký kết trên nền tảng đó. –

3

Nếu bạn thực hiện buf thành một unsigned char buf[2], bạn có thể chỉ đơn giản hóa nó;

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

Tôi đánh giá cao điều này đã được trả lời hợp lý. Tuy nhiên, một kỹ thuật khác là xác định macro trong mã của bạn, ví dụ:

// 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; 
} 
Các vấn đề liên quan