将float数组分别写为反向字节

问题描述 投票:-1回答:1

我将使用iOS Objective-C将字节数组创建为所需的输出。该方法将静态float数组转换为int8_t数组bytes数组。当涉及到实现时,我发现float数组中每个float的所有字节都按顺序颠倒了。输出显示为实际输出。您能告诉我如何转换每个字节并显示为所需输出吗?以下是我的工作:

 float floatArray[5] = {100.0 , 10.0 , 10.0 , 10.0 , 10.0 };
    NSUInteger lengthN = sizeof(floatArray) ;
    NSLog(@" length %lu" , (unsigned long)lengthN);


    int8_t oneByte = lengthN;
    int8_t prefix[4]  = {0x26, 0x24, 0x61 , oneByte };
     //  NSArray *charArray = arry; //20d = 14h
    //char arry[4]={ 0x26, 0x24, 0x61  , oneByte };
    int8_t data[lengthN + 5];


    memcpy (data, (int8_t *) &prefix, sizeof(prefix));

    memcpy (data+4, (int8_t *) &floatArray,  lengthN );

    int length = (int)lengthN + 5;
    int checkSum = 119 + 97 + (int)lengthN ;

    for(int  i = 4 ; i  < lengthN * 4 ; i *=4 ){
        [self swap: data[ 4*i +3] : data [4*i+ 0]];
        [self swap: data[ 4*i +2] : data [4*i+ 1]];
        [self swap: data[ 4*i +1] : data [4*i+ 2]];
        [self swap: data[ 4*i +0] : data [4*i+ 3]];

    }



- (void)swap:(int8_t)a :(int8_t)b {
    a ^= b;
    b ^= a;
    a ^= b;

}

实际输出

2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal -56
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 66
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 65

所需的输出

2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 66
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal -56
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.665 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.666 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.667 marker[2770:1000346] sdjhasdhal 65
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 32
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 0
2014-10-31 18:09:21.668 marker[2770:1000346] sdjhasdhal 0
ios byte nsdata uint8t
1个回答
0
投票

您正在使用一个可怕的,可怕的,可怕的技巧来交换字节。在代码审查中,您将丝毫没有机会实现这一目标。

更糟糕的是,您将字节0和3交换了两次,并与字节1和2进行了交换。猜猜将它们交换两次会发生什么?没有。

您还对处理器的字节顺序进行了假设(因为实际上,您不想reverse字节,而是希望将它们放入正确的顺序中)。为此,将memcpy从浮点数转换为uint32_t,然后通过按所需顺序将uint32_t的内容移位24、16、8和0位来提取四个字节。这样,处理器的字节顺序就无关紧要了。

PS。您的字节交换代码让我非常生气,我什至没有意识到您没有传递指针...

© www.soinside.com 2019 - 2024. All rights reserved.