요구 사항이 발생했습니다. 실제 유형의 JPG가있는 이미지 파일이 있다고 가정하고 누군가 JPG를 직접 복사하여 동일한 이름의 PNG 파일로 저장하는 것이 게으른다고 가정합니다. 이런 식으로 파일 AS3을 읽을 때 아무런 문제가 없지만 휴대 전화 C ++는 파일을 읽을 때 문제를 만집니다.
이제 폴더에서 모든 파일을 가로 지르고 "비정상적인"파일 형식의 파일을 찾기 위해 프로그램을 작성해야합니다. 우리의 자원은 주로 GIF, PNG 및 JPG입니다. 처음에는 온라인에서 기사를 찾았습니다. 이진 스트림 및 파일 헤더를 기반으로 파일 유형 MIME 유형을 얻은 다음 파일 바이너리의 헤더 정보를 읽고 실제 파일 유형을 얻은 다음 접미사 이름을 통해 얻은 파일 유형과 비교하십시오.
코드 사본은 다음과 같습니다.
var fd = fs.opensync (new_file_path, 'r');
var 버퍼 = 새로운 버퍼 (8);
var minetype = mime.lookup (new_file_path);
var filetype = mime.extension (minetype);
fs.ReadSync (fd, 버퍼, 0, 8, 0);
var newbuf = buffer.slice (0, 4);
var head_1 = newbuf [0] .ToString (16);
var head_2 = newbuf [1] .ToString (16);
var head_3 = newbuf [2] .ToString (16);
var head_4 = newbuf [3] .ToString (16);
var head_iden = head_1 + head_2;
var tempfileType = file_type_config [head_iden];
if (! tempfileType) {
head_iden += head_3;
tempfileType = file_type_config [head_iden];
if (! tempfileType) {
var msg = "알 수 없음 filetype" + new_file_path + '-' + filetype;
Showlog (MSG);
계속하다;
}
}
if (tempfileType! = filetype) {
var msg = "Error Filetype" + new_file_path + '-' + filetype + '|' + tempfileType + '-correct 이미지 파일 형식';
Showlog (MSG);
g_errorfiletyparr.push (msg);
}
나중에 노드 이미지와 관련된 정보를 검색 할 때이 기사를 찾았습니다. node.js 모듈 순위 >> (이미지)
그런 다음 모듈 "Node-ImageInfo"를 필터링하고 테스트를위한 예제를 작성했습니다 (JPG 파일의 접미사 이름을 PNG로 직접 수정) :
소스 코드, 관심이 있으시면 공부할 수 있습니다.
코드 사본은 다음과 같습니다.
함수 readUint32 (버퍼, 오프셋, bigendian) {
if (buffer.readuint32) {
return buffer.readuint32 (오프셋, bigendian);
}
var 값;
if (bigendian) {
if (buffer.readuint32be) {
return buffer.readuint32be (오프셋);
}
값 = (버퍼 [오프셋] << 24) + (버퍼 [오프셋 + 1] << 16) + (버퍼 [오프셋 + 2] << 8) + 버퍼 [오프셋 + 3];
}
또 다른 {
if (buffer.readuint32le) {
return buffer.readuint32le (오프셋);
}
값 = 버퍼 [오프셋] + (버퍼 [오프셋 + 1] << 8) + (버퍼 [오프셋 + 2] << 16) + (버퍼 [오프셋 + 3] << 24);
}
반환 값;
}
함수 readUint16 (버퍼, 오프셋, bigendian) {
if (buffer.readuint16) {
return buffer.readuint16 (오프셋, bigendian);
}
var 값;
if (bigendian) {
if (buffer.readuint16be) {
return buffer.readuint16be (오프셋);
}
값 = (버퍼 [오프셋] << 8) + 버퍼 [오프셋 + 1];
}
또 다른 {
if (buffer.readuint16le) {
return buffer.readuint16le (오프셋);
}
값 = 버퍼 [오프셋] + (버퍼 [오프셋 + 1] << 8);
}
반환 값;
}
함수 readbit (버퍼, 오프셋, 비트 오프셋) {
if (bitoffset> 7) {
오프셋 += math.floor (bitoffset / 8);
BitOffSet = BitOffset % 8;
}
var b = 버퍼 [오프셋];
if (bitoffset <7) {
b >>> = (7- 비트 오프셋);
}
var val = b & 0x01;
반환 val;
}
함수 readBits (버퍼, 오프셋, 비트 오프셋, 비트 렌, 서명) {
var val = 0;
var neg = false;
if (서명) {
if (readbit (버퍼, 오프셋, 비트 오프셋)> 0) {
NEG = TRUE;
}
Bitlen--;
Bitoffset ++;
}
var bytes = [];
for (var i = 0; i <bitlen; i ++) {
var b = readbit (버퍼, 오프셋, bitoffset + i);
if (i> 0 && (bitlen -i) % 8 == 0) {
바이트 .push (val);
val = 0;
}
val << = 1;
val | = b;
}
바이트 .push (val);
val = 새로운 버퍼 (바이트);
val.negative = neg? true : false;
반환 val;
}
함수 imageInfopng (버퍼) {
var imageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! CheckSig (버퍼, PO, ImageHeader)) {
거짓을 반환합니다.
}
pos += 4;
반품 {
유형 : '이미지',
형식 : 'png',
Mimetype : 'Image/Png',
너비 : readUint32 (버퍼, pos, true),
높이 : ReadUint32 (버퍼, POS+4, TRUE),
};
}
함수 imageInfojpg (버퍼) {
var pos = 2,
len = buffer.length,
sizeig = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (checksig (버퍼, pos, sizeig)) {
pos += 5;
반품 {
유형 : '이미지',
형식 : 'JPG',
Mimetype : 'Image/JPEG',
너비 : readUint16 (버퍼, pos+2, true),
높이 : ReadUint16 (버퍼, POS, True),
};
}
pos += 2;
var size = readUint16 (버퍼, pos, true);
pos += 크기;
}
}
함수 imageInfogif (버퍼) {
var pos = 6;
반품 {
유형 : '이미지',
형식 : 'gif',
Mimetype : 'Image/Gif',
너비 : readUint16 (버퍼, pos, false),
높이 : readUint16 (버퍼, pos+2, false),
};
}
함수 imageInFOSWF (버퍼) {
var pos = 8,
bitpos = 0,
발;
if (버퍼 [0] === 0x43) {
노력하다 {
// Zlib을 사용할 수있는 경우 (NPM 설치 zlib) 압축 된 플래시 파일을 읽을 수 있습니다.
버퍼 = 요구 ( 'zlib'). 팽창 (buffer.slice (8, 100));
pos = 0;
}
캐치 (예) {
// 압축 플래시 파일의 너비/높이를 얻을 수 없습니다 ... 아직 (Zlib 필요)
반품 {
유형 : '플래시',
형식 : 'swf',
Mimetype : 'Application/X-Shockwave-Flash',
너비 : 널,
높이 : null,
}
}
}
var numbits = readbits (버퍼, pos, bitpos, 5) [0];
비트 += 5;
val = readbits (버퍼, pos, bitpos, mumbits, true);
var xmin = (numbits> 9? readuint16 (val, 0, true) : val [0]) * (Val.negative? -1 : 1);
Bitpos += 숫자;
val = readbits (버퍼, pos, bitpos, mumbits, true);
var xmax = (numbits> 9? readuint16 (val, 0, true) : val [0]) * (Val.negative? -1 : 1);
Bitpos += 숫자;
val = readbits (버퍼, pos, bitpos, mumbits, true);
var ymin = (numbits> 9? readuint16 (val, 0, true) : val [0]) * (Val.negative? -1 : 1);
Bitpos += 숫자;
val = readbits (버퍼, pos, bitpos, mumbits, true);
var ymax = (numbits> 9? readuint16 (val, 0, true) : val [0]) * (Val.negative? -1 : 1);
반품 {
유형 : '플래시',
형식 : 'swf',
Mimetype : 'Application/X-Shockwave-Flash',
너비 : Math.ceil ((xmax -xmin) / 20),
높이 : Math.ceil ((Ymax -Ymin) / 20),
};
}
함수 checksig (버퍼, 오프셋, SIG) {
var len = sig.length;
for (var i = 0; i <len; i ++) {
var b = 버퍼 [i+오프셋],
s = sig [i],
m = 거짓;
if ( 'number'== typeof s) {
m = s === b;
}
또 다른 {
for (var k in s) {
var o = s [k];
if (o === b) {
m = 참;
}
}
}
if (! m) {
거짓을 반환합니다.
}
}
진실을 반환하십시오.
}
module.exports = function imageInfo (버퍼, 경로) {
var pngsig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
var jpgsig = [0xff, 0xd8, 0xff];
var gifsig = [0x47, 0x49, 0x46, 0x38, [0x37, 0x39], 0x61];
var swfsig = [[0x46, 0x43], 0x57, 0x53];
if (checksig (buffer, 0, pngsig)) imageInfopng (버퍼)를 반환합니다.
if (checksig (buffer, 0, jpgsig)) imageInfojpg (버퍼)를 반환합니다.
if (checksig (buffer, 0, gifsig)) ImageInfogif (buffer)를 반환합니다.
if (checksig (buffer, 0, swfsig)) imageInfoswf (버퍼)를 반환합니다.
거짓을 반환합니다.
};