파일에 널 바이트 만 포함되어 있는지 확인


12

목표는 파일의 경로를 나타내는 문자열을 입력으로 받아 파일이 비어 있지 않고 널이 아닌 바이트를 포함하지 않는 경우 값을 출력하는 프로그램이나 함수를 작성하는 것입니다. 즉, 모든 비트는 0- -그렇지 않으면 거짓 값.

나는 그것이 매우 간단한 문제라는 것을 알고 나는 무언가를 해킹 할 수 있다고 생각하지만, 짧고 우아한 방법이 있어야한다고 생각하며, 그로 인해 도전을 할 수있는 아이디어가 생겼습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. (내 자신의 선호는 가장 빠른 솔루션이 될 것이지만 구현에 너무 의존적입니다 ...)

관련 질문 : 0으로 파일 채우기

동기 부여 : 관심 이있는 경우에만 문제의 원인을 알려줍니다. 읽을 필요는 없습니다.

"dd"또는 다른 방법으로 복사 된 CD 및 DVD의 ISO 이미지는 종종 null 바이트 만 포함 된 쓸모없는 블록 시퀀스로 종료됩니다. 이러한 블록을 제거하는 표준 기술은 알려져 있고 간단 하지만 ( /unix/74827/ 참조 ) 매체가 자체 크기에 놓일 수 있기 때문에 때로는 null이 아닌 유용한 데이터를 제거 할 수 있습니다. 따라서 제거 된 블록에 null 바이트 만 포함되어 있는지 확인하고 싶습니다. 표준화 된 버전의 ISO 이미지를 정의하려면 이러한 블록을 제거해야합니다.

답변:


5

Pyth, 6 5 바이트

!sCM'

온라인으로 사용해보십시오!

STDIN에서 파일 이름을 가져 와서 파일을 읽고 읽은 다음 파일을 ints (Python 생각 ord) 목록으로 변환하고 sum( 0iff 파일은 모두 널 바이트를 리턴 함) not결과를 인쇄합니다.


야,

이것은 일반적인 프로그래밍 질문과 비슷합니다. 이것들은 스택 오버플로 에 속합니다 . 그러나 주요 게시물 아래의 의견에서 이것이 귀하의 의도가 아님을 알 수 있습니다. 즉, 토론이 양쪽에서 불필요하게 적대적이라고 느꼈기 때문에 여유를 찾아서 적절한 PPCG를 환영하기로 결정했습니다!

일반적으로 적절한 피드백을 받으려면 먼저 도전 과제를 샌드 박스 에 게시해야 합니다. 현재 제출 된 내용을보고 어떤 형식으로 도전 과제를 선호하는지 확인할 수 있습니다. 다음에 시도해주세요!

우리가 오해 당신을했습니다 당신이 이런 경우에 하는 일반적인 솔루션을 찾고, 여기 파이썬 3의 솔루션입니다 :

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))

1
이 기능은 강력하기 때문에 검은 색 픽셀 (0)로만 구성된 회색조 이미지에는 작동하지 않습니다 '.
user202729

OP는 명령 줄 인수를 사용하여 파일 이름을 입력으로 가져 와서 상태 코드로 반환해야합니다.
user202729

2

GNU sed -zn , 5 바이트

입력 파일은 명령 행 매개 변수로 sed에 전달됩니다. 표준 쉘 리턴 코드로 출력합니다. 즉, 0은 TRUE이고 1은 FALSE입니다.

/./q1

일반적 sed으로 개행으로 구분 된 입력 레코드 (AKA "라인")에서 작동합니다. -z이것을 널로 구분 된 입력 레코드로 변경합니다. 입력 레코드가 .정규식 과 일치하면 q종료 코드 1을 사용하십시오.

온라인으로 사용해보십시오!


2

DOS, 37 바이트


100:BE 80 00 MOV SI, 0080
103:AD       LODSW ;get command-line length
104:98       CBW ;only a byte
105:93       XCHG BX,AX
106:88 40 FF MOV [BX+SI-01], AL ;zero end of name
109:B4 3D    MOV AH, 3D
10B:89 F2    MOV DX, SI
10D:CD 21    INT 21 ;open file
10F:93       XCHG BX, AX ;handle into BX
110:AF       SCASW ;DI=0
111:B4 3F    MOV AH, 3F
113:B1 01    MOV CH, 01
115:CD 21    INT 21 ;read 1 byte
117:91       XCHG CX, AX
118:E3 06    JCXZ 0120 ;quit on EOF
11A:97       XCHG DI, AX ;set true for later
11B:38 2C    CMP [SI], CH
11D:74 F2    JZ 0111 ;loop while zero
11F:4F       DEC DI ;set false
120:97       XCHG DI, AX
121:B4 4C    MOV AH, 4C ;return
123:CD 21    INT 21

명령 줄에 이름이 지정된 파일을 열고 비어 있으면 0을 반환하거나 0이 아닌 값을 포함하면 1을 반환합니다.


1

첨부 , 24 바이트

Zero@Max&0@Ords@FileRead

온라인으로 사용해보십시오!

설명

이것은 4 개의 기능으로 구성되어 있으며, 하나씩 차례로 실행됩니다.

  • FileRead -파일 이름을 입력으로 사용하고 해당 파일의 내용을 반환합니다.
  • Ords -목록에서 각 문자의 ASCII 코드 포인트를 반환
  • Max&0-이것은 인수의 x경우 와 동일하다 Max[x, 0]. 이것은 차례로 x0( 0빈 목록에 대한 수확량) 의 모든 항목의 최대 값을 계산합니다.
  • Zero -이것은이 숫자가 실제로 0인지 확인하고 해당 부울을 리턴하는 술어입니다.

OP에는 전체 프로그램이 필요하고 명령 행에서 호출하며 인수를 사용하여 파일 이름을 입력으로 사용하고 상태 코드로 리턴하십시오. ( @_@)
user202729

이것은 빈 파일에 대해 오 탐지를 제공하지 않습니까?
ngenisis

1
@ngenisis 원래 문제는 다음과 같이 언급했습니다. "즉, 빈 파일이 정상으로 간주됩니다"-개정 기록을 확인하면 특정 사용자가 질문에서 지적한 부분을 편집 한 것으로 보입니다.
코너 O'Brien

1

C (32 비트 플랫폼), 65 바이트

main(x,v)int*v;{for(v=fopen(v[1],"r");!(x=fgetc(v)););return++x;}

포인터의 크기가 모두 같다고 가정하면 거의 항상 사실입니다. 0성공 하면 종료 코드 (파일에 NUL문자 만 포함 ) 와 함께 리턴되며, 그렇지 않으면 다른 값이 리턴됩니다 .

명령 행 인수가 읽을 수있는 파일의 경로가 아닌 경우 동작이 정의되지 않습니다.


나는 당신이 쓸 필요가 있다고 생각 int**v합니까? 그렇게하지 않으면 segfault가없는 컴파일러를 찾을 수 없습니다. 또한 의도적 으로 오류로 비트를 절약 할 수는 있지만 이것이 최선의 방법인지는 모르겠습니다.
FryAmTheEggman

응? 나는 mingw32에서 gcc로 이것을 시도했지만 완벽하게 작동합니다. 아마도 제약 조건 sizeof(void*) == sizeof(int)(또는 더 일반적으로 "32 비트 플랫폼")을 추가해야합니다 ... amd64플랫폼에서 -m32;으로 컴파일 해보십시오 .)
Felix Palmen

@FryAmTheEggman은 32 비트 코드 ( -m32) 로 컴파일 할 때 TIO에서도 작동 합니다. 온라인으로 사용해보십시오!
Felix Palmen

아 물론 이죠 그런 다음 좋은 일! 내 제안을 사용하여 몇 바이트를 절약하십시오 :)
FryAmTheEggman



0

자바, 149 바이트

boolean b(String f)throws Exception{java.io.InputStream s=new java.io.FileInputStream(f);int i=Math.abs(s.read());while(i==0)i+=s.read();return i<0;}

0

펄 5, 20 바이트

$\=0;exit<>=~/^\0+$/

명령 행 args에서 파일 이름을 가져 와서 프로그램의 종료 코드에서 응답을 리턴합니다.


0

파이썬 3, 59 바이트

f=lambda s:any(open(s,'rb').read())+not len(open(s).read())

성공하면 0을 리턴합니다 (모든 바이트는 0 임).

실패에 대해 1을 리턴합니다 (적어도 하나의 0이 아닌 바이트 또는 0 길이의 파일).


파일이 비어 있으면 실패를 리턴해야합니다.
Adám

0

APL (Dyalog Unicode) , 14 바이트

전체 프로그램. stdin에서 파일 이름을 묻습니다.

0=⌈/11 ¯1MAP

온라인으로 사용해보십시오!

 파일 이름을 묻습니다

11 ¯1⎕MAP 해당 파일을 압축 비트 배열에 매핑

⌈/ 최대 (감소); 비어 있으면 가장 작은 float, 그렇지 않으면 0 또는 1

0= 0과 같습니까?


0

하스켈, 49 바이트

import Data.ByteString
f=(all(<1)<$>).getContents

분명히 가져 오기가 포함되지 않은 경우 26 바이트입니다.


당신이 readFile대신 의미 를 추측합니다 getContets. 파일을 일반 문자열로 읽고 비교 =='\0'하거나 더 좋을 수 있다고 생각 <'\1'합니다 import. 익명 함수를 사용할 수 있으므로 f x=and and pointfree :를 삭제할 수 있습니다 (all(<'\1')<$>).readFile.
nimi

이진 파일 인 readFile경우을 (를) 사용할 수 없습니다 .이 경우 유효하지 않은 유니 코드 시퀀스가 ​​발생하면 예외가 발생합니다. pointfree에 관한 좋은 지적.
Izaak Weiss

0

자바 스크립트 (ES8), 52 바이트

URL을 인수로 true사용하고 파일이 비어 있지 않고 널 바이트가없는 경우 해결되는 약속을 리턴합니다.

async p=>!/\0|^$/.test(await(await fetch(p)).text())

0

Zsh , 35 바이트

! for c (${(s::)"$(<$1)"})((i|=#c))

온라인으로 사용해보십시오! 종료 코드를 통해 출력합니다.

읽고, 문자를 나누고, 비트 단위 또는 각 코드 포인트를 함께 읽습니다.

파일이 비어 있으면 루프 본문이 실행되지 않으므로 루프가 진실을 반환합니다. 진실 거짓 값을 교환 !할 수있는 경우 2 바이트 저장을 위해 행간 을 제거 할 수 있습니다.

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