2013-07-21 2 views
1

У меня есть 2 символа.2 Короткие буквы в C

Char 128 и Char 2.

Как превратить эти символы в короткие 640 в C?

Я попытался

unsigned short getShort(unsigned char* array, int offset) 
{ 
    short returnVal; 
    char* a = slice(array, offset, offset+2); 
    memcpy(&returnVal, a, 2); 
    free(a); 
    return returnVal; 
} 

Но это не сработало, он просто отображает его 128. Какой предпочтительный метод?

ответ

2

Вероятно, самый простой способ превратить двух символов, а и б, в короткий с, выглядит следующим образом:

short c = (((short)a) << 8) | b; 

Чтобы установить это в то, что у вас есть, самый простой способ, вероятно, что-то вроде этого:

unsigned short getShort(unsigned char* array, int offset) 
{ 
    return (short)(((short)array[offset]) << 8) | array[offset + 1]; 
} 
+0

С вашей модификации, это выводя '32770' вместо' 640'. –

+0

Это было бы до того, что у вас есть два символа. 32770 = 128 << 8 | 2 и 640 = 2 << 8 | 128. Если вы хотите это другим способом, просто переключите места смещения и смещения + 1. – qaphla

+0

@qalpha Что на земле ... Я имею их в правильном порядке [128, 2], но заменяя полученные значения. Что с этим? –

0

Я вижу, что вы на самом деле не пытается переложить биты, но собрать equivelant шестнадцатеричных значений вместе, как вы бы значения цвета в CSS.

Дайте этот код выстрел:

char b1=128,b2=2; 
    char data[16]; 

    sprintf((char *)data,"%x%x",(BYTE)b2,(BYTE)b1); 
    short result=strtol(data,(char **)NULL, 16); 
+0

Это похоже на действительно окольный способ сделать что-то. – tangrs

+0

Да, я на самом деле согласен, но я был на самом деле сильно озабочен тем, как SuperDisk прибыл на 640 из значений 128 и 2. Преобразуйте 2 в шестнадцатеричный, что является «2», преобразуйте 128 в шестнадцатеричный, что равно «80». Сбейте их вместе и получите шестнадцатеричное значение «280», теперь преобразуйте его в короткий. Бит сдвига во всех комбинациях не производил 640. – sthede

1

я вижу, что уже есть ответ, но я немного озадачен о том, что происходит с вашей первоначальной попытки. Следующий код показывает ваш способ и технику, используя union. Оба, похоже, работают нормально. Полагаю, вы, возможно, столкнулись с проблемой энтианности. Во всяком случае, возможно, эта демонстрация будет полезна, даже если ваша проблема уже решена.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    short returnVal; 
    char a[2]; 
    union { 
     char ch[2]; 
     short n; 
    } char2short; 

    a[0] = 128; 
    a[1] = 2; 

    memcpy(&returnVal, a, 2); 

    printf("short = %d\n", returnVal); 

    char2short.ch[0] = 128; 
    char2short.ch[1] = 2; 

    printf("short (union) = %d\n", char2short.n); 

    return 0; 
} 

Выходы:

 
short = 640 
short (union) = 640 
+0

Мне нравится метод Union! Спасибо за этот ответ. –

Смежные вопросы