-1

我将使用 iOS Objective-C 创建字节数组作为所需的输出。该方法是从静态浮点数组转换为 int8_t 数组字节数组。说到实现,我发现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
4

1 回答 1

0

你正在使用一个可怕的、可怕的、可怕的技巧来交换字节。在代码审查中,您将没有任何机会通过它。

更糟糕的是,您将字节 0 和 3 交换了两次,字节 1 和 2 也是如此。猜猜当您交换它们两次时会发生什么?没有什么。

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

PS。我被你的字节交换代码冒犯了,我什至没有意识到你没有传入一个指针......

于 2014-10-31T10:22:51.830 回答