简而言之,结合MSB和LSB

时间:2015-04-21 15:11:35

标签: c

我有一个返回1 Byte

的函数
uint8_t fun();

该函数应该运行9次,所以我得到9字节我想把最后8一个4 short values作为char array[9]; ............. for ( i = 0; i< 9 ; i++){ array[i] = fun(); } printf( " 1. Byte %x a = %d , b=%d c =%d \n" , array[0], *(short*)&(array[1]), *(short*)&(array[3]), *(short*)&(array[5]), *(short*)&(array[7])); 这里我做了但我不确定我的价值得到的是正确的:

{{1}}

是吗?

3 个答案:

答案 0 :(得分:2)

最好明确并将自己的8位值加入16位值:

uint8_t  bytes[9];
uint16_t words[4];

words[0] = bytes[1] | (bytes[2] << 8);
words[1] = bytes[3] | (bytes[4] << 8);
words[2] = bytes[5] | (bytes[6] << 8);
words[3] = bytes[7] | (bytes[8] << 8);

顺便说一下,上面假设是小端的。

答案 1 :(得分:1)

你会遇到对方问题。任何指向short的指针都可以看作是指向char的指针,但是在非8位机器上,不能保证反转。

恕我直言,这会更安全:

struct {
    char arr0;
    union {
        char array[8];
        uint16_t sarr[4];
    } u;
} s;

s.arr0 = fun();
for ( i = 0; i< 8 ; i++){
    s.u.array[i] = fun();
}

printf( " 1. Byte %x  a = %d , b=%d c =%d d=%d\n" ,
    s.arr0,   
            s.u.sarr[0],
            s.u.sarr[1],
            s.u.sarr[2],
            s.u.sarr[3]);

但我想你在你的机器上正确处理了字节序,并且知道转换2字符&lt; =&gt; 1短篇作品......

答案 2 :(得分:0)

尝试使用struct来安排数据和转换操作以转换为enianism。

// The existence of this function is assumed from the question.
extern unsigned char fun(void);

typedef struct
{
    unsigned char Byte;
    short WordA;
    short WordB;
    short WordC;
    short WordD;
}   converted_data;

void ConvertByteArray(converted_data* Dest, unsigned char* Source)
{
    Dest->Byte = Source[0];
    // The following assume that the Source bytes are MSB first.
    // If they are LSB first, you will need to swap the indeces.
    Dest->WordA = (((short)Source[1]) << 8) + Source[2];
    Dest->WordB = (((short)Source[3]) << 8) + Source[4];
    Dest->WordC = (((short)Source[5]) << 8) + Source[6];
    Dest->WordD = (((hshort)Source[7]) << 8) + Source[8];
}

int main(void)
{
    unsigned char array[9];
    converted_data convertedData;

    // Fill the array as per the question.    
    int i;
    for ( i = 0; i< 9 ; i++)
    {
        array[i] = fun();
    }

    // Perform the conversion
    ConvertByteArray(&convertedData, array);

    // Note the use of %h not %d to specify a short in the printf!
    printf( " 1. Byte %x  a = %h , b=%h c =%h d =%h\n",
        (int)convertedData.Byte,  // Cast as int because %x assumes an int.
        convertedData.WordA,
        convertedData.WordB,
        convertedData.WordC,
        convertedData.WordD );

   return 0;
}