Encontrei um requisito: suponha que haja um arquivo de imagem com o tipo real de JPG, e alguém está com preguiça de copiar diretamente o JPG e salvá -lo como um arquivo PNG com o mesmo nome. Dessa forma, não haverá problemas ao ler o arquivo AS3, mas o telefone celular C ++ encontra problemas ao ler o arquivo - -!
Agora você precisa escrever um programa para atravessar todos os arquivos em pastas e encontrar arquivos com formato de arquivo "incomum". Nossos recursos são principalmente GIF, PNG e JPG. No início, encontrei um artigo on-line: obtenha o tipo de arquivo MIME com base no fluxo binário e no cabeçalho do arquivo e, em seguida, leia as informações do cabeçalho do binário do arquivo, obtenha seu tipo de arquivo real e compare-o com o tipo de arquivo obtido através do nome do sufixo.
A cópia do código é a seguinte:
var fd = fs.opensync (new_file_path, 'r');
var buffer = novo buffer (8);
var minetype = mime.lookup (new_file_path);
var fileType = MIME.Extension (minetype);
fs.readsync (FD, buffer, 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 = "desconhecido FileType" + new_file_path + '-' + FileType;
showlog (msg);
continuar;
}
}
if (tempFileType! = FileType) {
var msg = "Erro filetype" + new_file_path + '-' + filetype + '|' + TempFileType + '-Correção de arquivo de arquivo de imagem';
showlog (msg);
g_errorFiletyPr.push (msg);
}
Posteriormente, ao procurar informações relacionadas à imagem do nó, encontrei este artigo: Node.js Module Ranking >> (imagens)
Em seguida, filtre um módulo "Node-ImageInfo" e escreveu um exemplo para teste (modifique deliberadamente o nome do sufixo do arquivo jpg diretamente para PNG):
Seu código -fonte, se você estiver interessado, pode estudá -lo:
A cópia do código é a seguinte:
função readUint32 (buffer, offset, bigendian) {
if (buffer.readUint32) {
retornar buffer.readUint32 (deslocamento, bigendiano);
}
Valor var;
if (bigendian) {
if (buffer.readuint32be) {
return buffer.readuint32be (deslocamento);
}
valor = (buffer [deslocamento] << 24) + (buffer [deslocamento + 1] << 16) + (buffer [deslocamento + 2] << 8) + buffer [deslocamento + 3];
}
outro {
if (buffer.readUint32le) {
return buffer.readuint32le (deslocamento);
}
valor = buffer [deslocamento] + (buffer [deslocamento + 1] << 8) + (buffer [deslocamento + 2] << 16) + (buffer [deslocamento + 3] << 24);
}
valor de retorno;
}
função readUint16 (buffer, offset, bigendian) {
if (buffer.readUint16) {
retornar buffer.readUint16 (deslocamento, bigendiano);
}
Valor var;
if (bigendian) {
if (buffer.readUint16be) {
return buffer.readuint16be (deslocamento);
}
valor = (buffer [deslocamento] << 8) + buffer [deslocamento + 1];
}
outro {
if (buffer.readUint16le) {
return buffer.readUint16LE (deslocamento);
}
valor = buffer [deslocamento] + (buffer [deslocamento + 1] << 8);
}
valor de retorno;
}
função readbit (buffer, deslocamento, bitoffset) {
if (bitoffset> 7) {
deslocamento += math.floor (bitoffset / 8);
bidoffset = bitoffset % 8;
}
var b = buffer [deslocamento];
if (bitoffset <7) {
b >>> = (7 - bitoffset);
}
var val = b & 0x01;
retornar val;
}
Função Readbits (buffer, deslocamento, bitoffset, bitlen, assinado) {
var val = 0;
var neg = false;
if (assinado) {
if (readbit (buffer, deslocamento, bitoffset)> 0) {
neg = true;
}
Bitlen--;
BITOFFSET ++;
}
var bytes = [];
for (var i = 0; i <bitlen; i ++) {
var b = readbit (buffer, deslocamento, bitoffset + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
bytes.push (val);
val = 0;
}
val << = 1;
val | = b;
}
bytes.push (val);
val = novo buffer (bytes);
val.Negative = neg? true: false;
retornar val;
}
função imageinfopng (buffer) {
var imageheader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! checksig (buffer, pos, imageheader)) {
retornar falso;
}
POS += 4;
retornar {
Tipo: 'imagem',
formato: 'png',
Mimetype: 'Image/png',
Largura: ReadUint32 (Buffer, POS, True),
Altura: ReadUint32 (buffer, pos+4, verdadeiro),
};
}
função imageinfojpg (buffer) {
var pos = 2,
len = buffer.length,
tamanhosg = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (checksig (buffer, pos, tamanhos)) {
POS += 5;
retornar {
Tipo: 'imagem',
formato: 'jpg',
Mimetype: 'imagem/jpeg',
Largura: ReadUint16 (Buffer, POS+2, True),
Altura: ReadUint16 (Buffer, POS, True),
};
}
pos += 2;
var size = readUint16 (buffer, pos, true);
POS += tamanho;
}
}
função imageinfogif (buffer) {
var pos = 6;
retornar {
Tipo: 'imagem',
formato: 'gif',
Mimetype: 'imagem/gif',
Largura: ReadUint16 (Buffer, POS, False),
Altura: ReadUINT16 (Buffer, POS+2, FALSE),
};
}
função imageinfoswf (buffer) {
var pos = 8,
bitpos = 0,
val;
if (buffer [0] === 0x43) {
tentar {
// Se você tiver zlib disponível (npm install zlib), podemos ler arquivos flash compactados
buffer = requer ('zlib'). Infle (buffer.slice (8, 100));
pos = 0;
}
Catch (ex) {
// Não é possível obter largura/altura dos arquivos flash compactados ... ainda (preciso do Zlib)
retornar {
Tipo: 'Flash',
Formato: 'SWF',
Mimetype: 'Application/X-Shockwave-Flash',
Largura: NULL,
Altura: NULL,
}
}
}
var numBits = readbits (buffer, pos, bitpos, 5) [0];
bitpos += 5;
val = readbits (buffer, pos, bitpos, entorpecido, true);
var xmin = (numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negativo? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, entorpecido, true);
var xmax = (numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negativo? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, entorpecido, true);
var ymin = (Numbits> 9? ReadUint16 (Val, 0, True): Val [0]) * (Val.negativo? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, entorpecido, true);
var ymax = (numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negativo? -1: 1);
retornar {
Tipo: 'Flash',
Formato: 'SWF',
Mimetype: 'Application/X-Shockwave-Flash',
Largura: Math.ceil ((xmax - xmin) / 20),
Altura: Math.ceil ((Ymax - Ymin) / 20),
};
}
Função verificação (buffer, deslocamento, sig) {
var len = sig.length;
for (var i = 0; i <len; i ++) {
var b = buffer [i+offset],
s = sig [i],
m = false;
if ('número' == tipoof s) {
m = s === b;
}
outro {
para (var k em s) {
var o = s [k];
if (o === b) {
m = true;
}
}
}
if (! m) {
retornar falso;
}
}
retornar true;
}
module.exports = function imageinfo (buffer, caminho) {
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)) retorne imageInfopng (buffer);
if (checksig (buffer, 0, jpgsig)) retorne imageInfojpg (buffer);
if (checksig (buffer, 0, gifsig)) retorne imageInfogif (buffer);
if (checksig (buffer, 0, swfsig)) retorne imageInfoswf (buffer);
retornar falso;
};