필터 지우기
필터 지우기

Distinguish between ASCII and Binary

조회 수: 16 (최근 30일)
Tero
Tero 2020년 11월 5일
답변: DGM 2024년 3월 25일
What could be an elegant way to distinguish an ASCII file from a Binary one? Specifically, I'm working with STL files that can be both, and I need a solution how to seperate those two
Thanks,
Tero
  댓글 수: 2
Stephen23
Stephen23 2020년 11월 5일
편집: Stephen23 2020년 11월 5일
The elegent way is to read the file format description. Wikipedia gives an outline:
Apparently STL text files must start with the string "solid", whereas STL binary files must NOT start with that string. So to know the difference, you just need to read the first five characters. And testing those five characters is easy in "an elegant way", certainly much faster and more elegant than parsing the entire file.
Chris Hooper
Chris Hooper 2024년 3월 25일
I read a claim that some binary .stl files can still begin with "solid". not sure if its true.

댓글을 달려면 로그인하십시오.

채택된 답변

Bruno Luong
Bruno Luong 2020년 11월 5일
I don't know if it's an elegant way but I just test if any charater is > 255
fid = fopen(stlfilename,'rt');
if fid > 0
try
c = textscan(fid,'%s','delimiter','\n');
fclose(fid);
catch ME
message = ME.message;
h = errordlg(message);
waitfor(h);
OK = -2;
return
end
else
OK = -2;
message = 'Cannot open STL file';
h = errordlg(message);
waitfor(h);
return
end
c = c{1};
c(cellfun(@isempty,c)) = [];
if max(cellfun(@max,c)) > 255
% Binary
...
else
% Ascii
...
end
  댓글 수: 3
Ameer Hamza
Ameer Hamza 2020년 11월 5일
This test can produce false negatives. For example
fid = fopen('file.bin', 'w');
fwrite(fid, [65 66 67 68], 'uint8')
fclose(fid)
Test
fid = fopen('file.bin','rt');
c = textscan(fid,'%s','delimiter','\n');
fclose(fid);
c = c{1};
c(cellfun(@isempty,c)) = [];
Result
>> max(cellfun(@max,c)) > 255
ans =
logical
0
Bruno Luong
Bruno Luong 2020년 11월 5일
We are talking about STL file, that can be ascii/binary, no any binary file.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

DGM
DGM 2024년 3월 25일
See also stlGetFormat() from stltools on the FEX:

카테고리

Help CenterFile Exchange에서 STL (STereoLithography)에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by