실제로 바이트 스트림이란 무엇입니까?


34

누구든지 바이트 스트림에 실제로 어떤 내용이 들어 있는지 설명 할 수 있습니까? 바이트 (16 진 데이터) 또는 이진 데이터 또는 영어 문자 만 포함합니까? 또한 "원시 데이터"라는 용어에 대해 혼란스러워합니다. 누군가가 "4 바이트 데이터를 뒤집으라고"요청한 경우 데이터가 16 진 코드 또는 2 진 코드라고 가정하면 어떻게됩니까?


내 두 센트는 대답 할 가치가 없으며 (아래에 이미 좋은 것들이 있습니다.) 저는 "원시 데이터"가 실제로 무언가를 의미하는 것으로 해석되는 방법에 대한 좋은 통찰력을 제공 할 수있는이 두 기사에 대한 링크를 제공하고 싶습니다. 무엇을 표현해야하고 그것을 어떻게 인코딩 / 저장하는지 알지 않는 한 무엇이든 의미합니다) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael

1
문자로 이해할 수없는 것들에 대해 c / c ++의 char을 사용하지 않기 위해 java가 바이트를 생성했다고 생각합니다. char의 크기가 1 바이트이므로 char은 c / c ++에서 많이 사용되었습니다. 또한 유닉스의 장치는 블록 및 문자 장치입니다. 문자 장치에서 읽을 경우 부호없는 문자 / 바이트 스트림이 나타납니다.
imel96

바이트 스트림이 모호합니다. 옥텟 스트림이 아닙니다.
사슴 사냥꾼

여러 수준에서 데이터를 해석 할 수 있습니다. 하단에는 일련의 온-오프 전기 레벨이 있습니다. 조금 더 높으면 바이트 덩어리이거나 바이트 스트림 입니다. 더 높은 곳에서는 원시 데이터를 해석하기 시작합니다. 바이트는 여러 가지 방식으로 텍스트로 해석 될 수 있습니다 (인코딩). 정수도 (큰 또는 작은 엔디안). 더 높이 올라갈 수도 있습니다. zip 파일이 있습니다. 그 zip 파일은 어제의 백업입니다. 등등. 문제는 정확한 수준이 암시적이고 명확하지 않은 경우가 많으므로 혼동 될 수 있습니다.
nalply

답변:


52

바이트 스트림에는 바이트가 포함됩니다. 실제로는 1과 0으로 구성된 8 비트입니다. 숫자를 나타내는 경우 0에서 255 사이의 숫자가됩니다 (IP 주소의 4 숫자가 항상 0에서 255 사이 인 이유는 우연이 아닙니다). 바이트 스트림 은 일반적으로 순환 버퍼를 유지하는 데 사용되는 기본 기본 바이트 배열을 숨기는 정교한 인터페이스입니다 (버퍼를 채우고 누군가 비우기를 기다릴 때 버퍼를 다시 채우는 것).

도대체 무엇을 나타내는가? 텍스트 파일이나 이미지 또는 라이브 비디오 스트림을 나타낼 수 있습니다. 무엇는 것은 그것을 읽는 사람의 상황에 따라 전적으로 의존한다. 16 진수 표현은 같은 말을하는 또 다른 방법이지만 때로는 숫자가 아닌 16 진수 표현으로 바이트를 관리하는 것이 더 편리하지만 같은 것입니다.

원시 데이터를 언급 할 때는 일반적으로 바이트 데이터를 참조합니다. "이미지 파일입니다!"라는 태그가없는 데이터가 제공됩니다. 일반적으로 데이터가 전체적으로 나타내는 것을 신경 쓰지 않으면 원시 데이터 만 처리합니다. 예를 들어, 이미지를 흑백 버전으로 변환하려면 이미지의 원시 데이터를 읽고 3 바이트마다 읽습니다 (실제로 붉은 색, 녹색, 파란색), 숫자 값을 더하고 3으로 나눈 다음 해당 값을 3 번 씁니다. 본질적으로 내가하고있는 일은 픽셀의 빨강, 녹색 및 파랑 값을 평균화하고 그와 동등한 회색 픽셀을 만드는 것입니다. 그러나 "바이트 단위"수준에서 데이터에 대한 작업 수행에 대해 이야기 할 때는

또는 파일을 데이터베이스에 저장하려고하지만 "원시 데이터"를 Blob 데이터 형식으로 삽입하도록 요청합니다. 이것은 단순히 파일의 데이터를 데이터베이스가 이해하고 관리 할 수있는 큰 바이트 배열로 변환하는 것을 의미합니다. 데이터베이스에서 해당 값을 검색 할 때 처음에 데이터베이스에 제공 한 값은 단순히 하나의 큰 바이트 배열이라는 것을 알 수 있습니다. 해당 데이터가 파일 인 경우 프로그래머는 파일을 한 번에 한 바이트 씩 읽는 것처럼 해당 바이트 데이터를 재 해석해야합니다.

누군가가 "4 바이트 데이터를 뒤집으라고"요청했다면 빅 엔디안 대 리틀 엔디안 숫자 해석을 참조한다고 가정합니다.이 숫자는 가장 중요하거나 가장 작은 바이트로 시작합니다. 숫자가 빅 엔디안 또는 리틀 엔디안으로 표시되는지 여부는 중요하지 않습니다. 단지 숫자를 읽는 모든 시스템이 지속적으로 해석한다는 것입니다.

이것은 실제 숫자 표현 (또는 그 문제에 대한 16 진수 표현)이 변경되었다고 말하는 것이 아니라 단순히 4 바이트가 숫자를 만드는 순서를 바꿔야한다는 것입니다. 따라서 0x01, 0x02, 0x03 및 0x04가 있다고 가정하십시오. 이것을 반대로 바꾸려면 대신 0x04, 0x03, 0x02, 0x01이 필요합니다. 시스템은 아마도이 4 바이트를 역순으로 읽었으며 이미 역순으로 값을 읽었으므로 값은 원시 데이터에서 의도 한 것과 매우 동일한 것으로 해석됩니다.

나는 그것이 그것을 설명하기를 바랍니다!


다 괜찮습니다 ..! "원시 데이터"에 대한 답변을 자세히 설명해 주시겠습니까?
user2720323

@ user2720323 자, 더 나은 "원시 데이터"를 설명하도록 수정되었습니다. :)
Neil

명심해야 할 것은 ... 모든 데이터는 단순히 바이트의 모음입니다. 이러한 바이트의 의미는 일종의 메타 데이터 (파일 확장자, 데이터베이스 필드 등)에 의해 정의됩니다. 이미지 파일은 ASCII 파일로 해석 될 수 있으며 그 반대도 마찬가지입니다. 텍스트 나 이미지는 의미가 없지만 여전히 가능합니다. (Derp ... 다음 답변을 읽어야합니다)
Dave Nay

2
@kevincline 아이디어를 전하려고 노력하고 있다는 사실에 감사하십시오. 우선 순위는 정확한 알고리즘을 작성하지 않는 것입니다. 더 정확하게하려면 인간의 눈이인지 할 수있는 것에 따라 빨강 녹색 및 파랑 값을 측정합니다.
Neil

18

바이트는 단순히 정보의 한 단위입니다. 무엇이든 가능합니다. 바이트 자체는 아무 의미가 없으며 어떤 의미를 부여해야합니다.

그래서, 그것을 확장하려면-

바이트 (16 진 데이터) 또는 이진 데이터 또는 영어 문자 만 포함합니까?

16 진 데이터는 2 진 데이터와 동일합니다. 데이터를 표시하는 다른 방법 일뿐입니다. 예를 들어 0x41 = 0b01000001 = 'A'= 65 (10 진수)입니다. 영어 문자는 그 일부일뿐입니다.

누군가가 "4 바이트 데이터를 뒤집으라고"요청한 경우 데이터가 16 진 코드 또는 2 진 코드라고 가정하면 어떻게됩니까?

16 진은 데이터 의 표현 일 뿐이므로 어떻게 생각하는지는 중요하지 않습니다. 의 데이터가있는 경우 데이터 0x65 0x66 0x67 0x68를 되돌릴 수 있습니다 0x68 0x67 0x66 0x65. 이 데이터를 문자로보고 있다면 원래는 A B C D있지만 지금은을 갖습니다 D C B A.

바이트 스트림으로 돌아 가면 데이터 시퀀스 일뿐입니다. 사용하려면 데이터가 무엇을 나타내는 지 알아야합니다. 텍스트 파일을 읽는 중이라면 파일을 읽을 때 얻을 수있는 바이트 스트림은 일종의 문자 일뿐입니다. 실행 파일에는 인쇄 할 수없는 문자가 많이 있으므로 이진 파일 이라고 합니다. 분명히 텍스트 편집기에서 실행 파일을 열 수는 있지만 유용한 것은 없습니다.


1
+1이지만 위도 비트 에서 이진 에 대한 강조 는 잘못 배치 된 것 같습니다. "이진 데이터"에는 인쇄 할 수없는 문자가 포함되는 경우가 많지만 인쇄 할 수없는 문자가 포함 된 것이 아니라 이진 숫자로 구성되어 있기 때문에 "이진"이라고합니다. 인쇄 가능한 "텍스트"데이터와 반대로 "이진"을 사용하고 있음을 이해하지만 OP가 더 혼란 스러울 수 있다고 생각합니다.
Caleb

반전에 관한 질문이 하나 있습니다. 파일에 정수 (32 비트) 325487이 있으면 어떻게이 4 바이트 정수를 되돌릴 수 있습니까? 마찬가지로 모든 단어를 바이트로 가정 하여이 문자열을 되 돌리는 방법 ( "하이 어떻습니까?")이 있습니다.
user2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); 문자 그대로 각 바이트를 가져 와서 올바른 위치로 옮기고 다른 바이트와 결합합니다.
Neil

2

바이트 스트림은 순서가 지정된 바이트 시퀀스입니다. 선행 바이트가없는 첫 번째 바이트가 있습니다. 그 후속은 두 번째 바이트입니다. 오늘날, 바이트는 8 비트로 구성되는 것으로 널리 이해된다. 더 정확하게하려면 옥텟 스트림 이라는 용어를 사용합니다octet . 폭이 8 비트가 아닌 바이트를 가진 컴퓨터가 여전히 존재합니다.

16 진수는 숫자를 쓰는 방법이며 이진 데이터 의 인쇄 표현 으로 사용됩니다. 16 진법은 실제로 텍스트입니다. 예를 들어, 16 진 값 FE은 바이트 ( 11111110십진수 값을 갖는 비트) 를 나타낼 수 있습니다 255. 그러나 FE실제로는 문자 F와 로 구성된 문자열이며 US-ASCII 또는 ISO-646 문자 세트에서 2 바이트 E가 필요합니다 ! 이 두 바이트는 무엇 이며 , 값이 254 인 단일 바이트는FE FE 는 인쇄 된 표기법으로 나타냅니다 .

통신 채널 또는 파일 핸들 또는 일부 장치가 바이트 스트림을 전달하는 것으로 설명되고 다른 정보가 제공되지 않으면 거의 확실하게 수행됩니다. 않은 바이트가 16 진 텍스트로 표시되므로 스트림의 각 추상 바이트가 필요합니다 두 물리 바이트.

원시 데이터는 단순히 "비트 배열"이상의 구조로 해석되지 않는 비트를 의미합니다. 원시 데이터는 일반적으로 구조를 가지며 무언가를 나타냅니다. 그러나 원시 데이터로 볼 때 순간 해석을 무시하고 있습니다 (예를 들어, 데이터 유형의 원시 표현을보고 데이터의 정확성을 확인합니다) 비트 수준 세부 정보까지) 또는 해석을 사용할 수 없습니다 (데이터가 있지만 데이터의 구조와 해당 데이터의 내용을 이해하지 못함).


PDP-10에는 가변 크기의 바이트를 처리하기위한 지침이있었습니다. 가장 일반적인 것은 7 비트 ASCII이고 그 뒤에 6 비트 문자가있었습니다.
케빈 클라인

0

바이트는 8 비트입니다. 비트는 0 또는 1입니다. "미가공 데이터"는 단지 한 바이트의 흐름입니다. 바이트 스트림은 파일, 네트워크 연결, 직렬화 된 객체, 난수 생성기 등에서 올 수 있습니다.

  • 바이트를 표시하는 방법에는 이진 (01110110), 16 진수 = 16 진 (7C), 8 진 (0271) 또는 10 진수 (215)와 같은 여러 가지 방법이 있습니다. 모든 경우에 최대 값은 255 (기본 10)입니다.

  • 때때로 바이트는 ASCII와 같은 문자에 할당됩니다. 유닉스 커맨드 라인에 "ascii"를 입력하면, 바이트 베일 0-255 또는 (0-FF 16 진수)를 연관된 문자에 매핑하는 큰 테이블을 얻게됩니다. 예를 들어, 공백은 x20이고 "A"는 x40입니다. 일부 바이트 값은 제어 문자에 매핑되며 인쇄 할 수 없습니다. 그러나 바이트 자체는 문자가 아니며 비트 묶음 일뿐입니다. 숫자

  • "역 4 바이트"는 바이트 123 42 231 0을 가져 와서 순서를 뒤집는 것입니다-0 231 42 123. 바이트 스팀에 적용됩니다. 아마도 4 바이트를 읽고, 반대로, 다음 4 바이트를 읽습니다. .

(BTW는 바이트 단위로 255보다 큰 숫자를 나타내려면 하나 이상의 바이트를 사용해야하기 때문에 문제가 관련이 있습니다. 그러나 문제는 "가장 큰"바이트가 먼저 오거나 마지막에 오는가? 빅 엔디안 또는 리틀 엔디안-원시 바이트 스트림에서 바이트를 뒤섞는 것이 왜 유용한 지에 대한 더 많은 배경을 찾으십시오.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.