2014-10-31 3 views
-1

iOS objective-C를 사용하여 원하는 출력으로 바이트 배열을 만들려고합니다. 메서드는 정적 float 배열에서 int8_t 배열 바이트 배열로 변환됩니다. 구현에 관해서, 나는 float 배열의 각 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 preffix[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 *) &preffix, sizeof(preffix)); 

    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 
+0

* endianness *에 대해 알고 있습니까? – trojanfoe

+0

오, 젠장, 나는 바이트로 부동 소수점을 복사하는 메모리를 생각해 봤지만 그것이 쓰여지는 LSB임을 깨달았다! 감사합니다.] –

+0

이 작업을 수행해야 할 때와하지 않을 때를 이해해야합니다. 하나의 예는 데이터를 전송해야하고 다른 시스템의 엔디안 니스를 모르는 경우입니다. 이 경우'ntohl()'(network to host, long)과 같은 함수가 존재하여 미리 합의 된 바이트 순서 (big-endian)로 변환된다. – trojanfoe

답변

0

당신은 바이트를 교환 끔찍한, 끔찍한, 무서운 트릭을 사용하고 있습니다 : 아래는 내 작업이다. 코드 리뷰에서 그 문제를 해결할 수있는 가장 작은 기회는 없을 것입니다.

0 및 3 바이트를 두 번 두 번 바꿔서 바이트 1 및 2와 동일하게 바꾸는 것이 더욱 어렵습니다. 두 번 바꿔 치기하면 어떻게 될까요? 아무것도.

실제로 프로세서의 바이트 순서에 대한 가정을하고 있습니다. 실제로는 바이트를 반대로 바이트로 바꾸고 싶으므로 올바른 순서로 넣으려고합니다. 그런 다음 memcpy를 float에서 uint32_t로 만든 다음 uint32_t의 내용을 원하는 순서대로 24, 16, 8 및 0 비트 씩 이동하여 4 바이트를 추출합니다. 그러면 프로세서의 바이트 순서는 부적합합니다.

추신. 나는 당신의 바이트 스와핑 코드에 너무 화가났다. 나는 심지어 포인터를 건네주지 않았다는 것을 깨닫지 못했다 ...

PPS. 대부분의 사람들은 "preffix"와 같은 변수 이름에서 맞춤법 오류를 싫어합니다.

+0

"모자". 좋은 것. – trojanfoe