안녕하세요!
이번엔 Data에 마이너스 값을 넣기 위한 방법을 다뤄볼 예정입니다.
스위프트에서 Data는 Structure로 Objective - C API인 NSData와 NSMutableData와 bridge 되어있습니다.
Data는 인덱스당 8비트의 unsigned integer값을 넣을 수 있습니다.
따라서 각 인덱스에 넣기 위해서는 10진수로 0~255이하의 값이 들어가야하는 것이죠.
==========================
print(UInt8.max)
//255
==========================
==========================
let positiveNum = 234
var positiveData: Data = Data.init(count: 1)
positiveData[0] = UInt8(positiveNum)
dump(positiveData)
▿ 1 bytes
- count: 1
▿ pointer: 0x000060c000010d80
- pointerValue: 106377750056320
▿ bytes: 1 element
- 234
==========================
그렇다면 마이너스 값은 어떻게 넣어야 할까요?
우리는 이때 init(bitPattern x:)를 사용하면 됩니다.
이 init 메소드는 UInt8, UInt16, UInt32, UInt64에 모두 존재합니다.
==========================
let negativeNum = -234
var negativeData: Data = Data.init(count: 1)
Int8(negativeNum)
==========================
이렇게 하면 어떤 결과가 나올까요?
==========================
Fatal error: Not enough bits to represent a signed value
==========================
이런 에러가 나타납니다;;
무엇이 문제일까요?
Int8 로 표현되기에는 비트가 충분하지 않다는 건데요.
==========================
print(Int8.max)
//127
==========================
8비트의 integer 값은 -128~127사이의 값이어야 합니다.
따라서, -234값을 처리하기 위해서는 2바이트값 즉, 16비트가 필요한것이죠.
그럼 먼저 Int16으로 값을 변경해 보겠습니다.
==========================
print(Int16(negativeNum))
//-234
==========================
-234가 문제없이 출력됩니다.
이제 UInt16으로 처리하겠습니다.
==========================
let negativeNumInt16: Int16 = Int16(negativeNum)
let negativeNumUInt16: UInt16 = UInt16.init(bitPattern: negativeNumInt16)
print(negativeNumUInt16)
//65302
==========================
65302가 나왔습니다;;
이게 뭘까요??
2진수로 변환하면 1111 1111 0001 0110 값이 나옵니다.
234를 2진수로 변환하면 0000 0000 1110 1010의 값이 나오고,
이를 다시 0 -> 1로 1 -> 0로 변환하면 1111 1111 0001 0101 이 됩니다.
여기에 1을 더하면, 1111 1111 0001 0110 이 값이 나오는 것이죠.
이를 우리는 2의 보수법이라고 부릅니다.
-234를 Data에 넣기 위해서는 총 2바이트가 필요하다고 위에 설명했었는데요.
이를 처리하기 위해 비트 연산을 하여 Data에 넣으면 됩니다.
==========================
negativeData[0] = UInt8(negativeNumUInt16 >> 8)
negativeData[1] = UInt8(negativeNumUInt16 & 0x00FF)
dump(negativeData)
▿ 2 bytes
- count: 2
▿ pointer: 0x0000608000007950
- pointerValue: 106102872111440
▿ bytes: 2 elements
- 255
- 22
==========================
읽어주셔서 감사합니다~
'iOS > Swift' 카테고리의 다른 글
Top-Level Code가 무슨의미지??? - Swift (0) | 2022.10.13 |
---|---|
[Swift API Guidline] Naming (0) | 2018.05.31 |
Swift - DEBUG Flag 사용하기! (0) | 2018.02.21 |
기본 문법 - 데이터 타입 기본 (0) | 2017.12.29 |
UITableView - iOS 10과 iOS 11에서 UITableViewCell의 superview 주의점! (0) | 2017.12.26 |