2013-07-21 29 views
1

我有2個字符。2個字母C短於

Char 128 and Char 2

如何將這些字符轉換爲C中的短640

我已經試過

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

大概翻二字符,a和b,成短c中的最簡單的方法,如下:

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

我看到你實際上並沒有嘗試移位,而是將十六進制數值組合在一起,就像你在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是如何從128和2的值到達640的。將2轉換爲16進制,即'2',將128轉換爲16進制,即'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方法!感謝這個答案。 –