iOS/Swift

Data - 마이너스 값 넣기!

DevBabamba 2017. 12. 21. 14:51
반응형

안녕하세요!


이번엔 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


==========================


읽어주셔서 감사합니다~












반응형