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
* endianness *에 대해 알고 있습니까? – trojanfoe
오, 젠장, 나는 바이트로 부동 소수점을 복사하는 메모리를 생각해 봤지만 그것이 쓰여지는 LSB임을 깨달았다! 감사합니다.] –
이 작업을 수행해야 할 때와하지 않을 때를 이해해야합니다. 하나의 예는 데이터를 전송해야하고 다른 시스템의 엔디안 니스를 모르는 경우입니다. 이 경우'ntohl()'(network to host, long)과 같은 함수가 존재하여 미리 합의 된 바이트 순서 (big-endian)로 변환된다. – trojanfoe