Encontré un requisito: supongo que hay un archivo de imagen con el tipo real de JPG, y alguien es vago para copiar JPG directamente y guardarlo como un archivo PNG del mismo nombre. De esta manera, no habrá problemas al leer el archivo AS3, pero el teléfono móvil C ++ encuentra problemas al leer el archivo - - ¡!
Ahora debe escribir un programa para atravesar todos los archivos en carpetas y encontrar archivos con formato de archivo "inusual". Nuestros recursos son principalmente GIF, PNG y JPG. Al principio, encontré un artículo en línea: obtenga el tipo de archivo de tipo MIME basado en la transmisión binaria y el encabezado del archivo, y luego lea la información del encabezado del binario de archivo, obtenga su tipo de archivo real y compárelo con el tipo de archivo obtenido a través del nombre del sufijo.
La copia del código es la siguiente:
var fd = fs.opensync (new_file_path, 'r');
var buffer = new 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 = "Unk Know Filetype" + new_file_path + '-' + fileType;
showlog (msg);
continuar;
}
}
if (tempfileType! = fileType) {
var msg = "Error FileType" + new_file_path + '-' + fileType + '|' + tempfileType + '-formato de archivo de imagen correcto';
showlog (msg);
g_errorFiletyParr.push (msg);
}
Más tarde, al buscar información relacionada con la imagen del nodo, encontré este artículo: Ranking del módulo Node.js >> (imágenes)
Luego filtre un módulo "nodo-iMageInfo" y escribió un ejemplo para las pruebas (modifique deliberadamente el nombre de sufijo del archivo jpg directamente a png):
Su código fuente, si está interesado, puede estudiarlo:
La copia del código es la siguiente:
función readuInt32 (buffer, offset, bigendian) {
if (buffer.readuInt32) {
return buffer.readuInt32 (offset, bigendian);
}
valor var;
if (bigendian) {
if (buffer.readuint32be) {
return buffer.readuInt32Be (offset);
}
value = (buffer [offset] << 24) + (buffer [offset + 1] << 16) + (buffer [offset + 2] << 8) + buffer [offset + 3];
}
demás {
if (buffer.readuint32le) {
return buffer.readuInt32le (offset);
}
value = buffer [offset] + (buffer [offset + 1] << 8) + (buffer [offset + 2] << 16) + (buffer [offset + 3] << 24);
}
valor de retorno;
}
function readuInt16 (buffer, offset, bigendian) {
if (buffer.readuInt16) {
return buffer.readuInt16 (offset, bigendian);
}
valor var;
if (bigendian) {
if (buffer.readuInt16be) {
return buffer.ReaduInt16be (compensación);
}
valor = (búfer [offset] << 8) + buffer [offset + 1];
}
demás {
if (buffer.readUint16le) {
return buffer.readuInt16le (offset);
}
value = buffer [offset] + (buffer [offset + 1] << 8);
}
valor de retorno;
}
función readbit (buffer, offset, bitoffset) {
if (bitoffset> 7) {
offset += math.floor (bitoffset / 8);
bitoffset = bitoffset % 8;
}
var b = buffer [offset];
if (bitoffset <7) {
b >>> = (7 - bitoffset);
}
var val = b & 0x01;
devolver val;
}
Function Readbits (buffer, offset, bitoffset, bitlen, firmado) {
var val = 0;
var neg = false;
if (firmado) {
if (readbit (buffer, offset, bitoffset)> 0) {
neg = verdadero;
}
bitlen--;
bitoffset ++;
}
var bytes = [];
para (var i = 0; i <bitlen; i ++) {
var b = readbit (buffer, offset, bitoffset + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
bytes.push (val);
val = 0;
}
val << = 1;
val | = b;
}
bytes.push (val);
val = nuevo búfer (bytes);
val.negative = neg? True: False;
devolver val;
}
función imageInfopng (buffer) {
var ImageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! checksig (buffer, pos, imageheader)) {
devolver falso;
}
pos += 4;
devolver {
Tipo: 'Imagen',
Formato: 'PNG',
MIMETYPE: 'Imagen/PNG',
Ancho: ReaduInt32 (buffer, pos, verdadero),
Altura: ReaduInt32 (búfer, pos+4, verdadero),
};
}
función imageInfoJpg (buffer) {
var Pos = 2,
len = buffer.length,
tamesig = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (checksig (buffer, pos, tamesig)) {
pos += 5;
devolver {
Tipo: 'Imagen',
Formato: 'JPG',
MIMETYPE: 'Imagen/JPEG',
Ancho: ReaduInt16 (búfer, pos+2, verdadero),
Altura: ReaduInt16 (búfer, pos, verdadero),
};
}
pos += 2;
tamaño var = readuInt16 (buffer, pos, true);
pos += tamaño;
}
}
función imageInfogif (buffer) {
var Pos = 6;
devolver {
Tipo: 'Imagen',
Formato: 'GIF',
MIMETYPE: 'Imagen/GIF',
Ancho: ReaduInt16 (buffer, pos, falso),
Altura: ReadUint16 (búfer, pos+2, falso),
};
}
función imageInfosWf (buffer) {
VAR POS = 8,
bitpos = 0,
val;
if (buffer [0] === 0x43) {
intentar {
// Si tiene ZLIB disponible (NPM Install ZLIB), entonces podemos leer archivos flash comprimidos
buffer = request ('zlib'). inflate (buffer.slice (8, 100));
pos = 0;
}
Catch (ex) {
// No se puede obtener el ancho/altura de los archivos flash comprimidos ... aún (necesito ZLIB)
devolver {
Tipo: 'flash',
Formato: 'swf',
MIMETYPE: 'Aplicación/X-Shockwave-Flash',
Ancho: NULL,
Altura: NULL,
}
}
}
VAR NUBBITS = Readbits (buffer, pos, bitpos, 5) [0];
bitpos += 5;
val = readbits (buffer, pos, bitpos, adornos, verdadero);
var xmin = (numbits> 9? readuint16 (val, 0, verdadero): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, adornos, verdadero);
var xmax = (Numbits> 9? ReadUint16 (Val, 0, verdadero): Val [0]) * (Val.Negative? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, adornos, verdadero);
var ymin = (NUMBITS> 9? ReadUint16 (Val, 0, verdadero): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (buffer, pos, bitpos, adornos, verdadero);
var ymax = (numbits> 9? readuint16 (val, 0, verdadero): val [0]) * (val.negative? -1: 1);
devolver {
Tipo: 'flash',
Formato: 'swf',
MIMETYPE: 'Aplicación/X-Shockwave-Flash',
Ancho: Math.ceil ((xmax - xmin) / 20),
Altura: Math.ceil ((ymax - ymin) / 20),
};
}
function checksig (buffer, offset, SIG) {
var len = sig.length;
para (var i = 0; i <len; i ++) {
var b = buffer [i+offset],
S = Sig [i],
m = falso;
if ('número' == typeof s) {
M = S === B;
}
demás {
para (var k in s) {
var o = s [k];
if (o === b) {
m = verdadero;
}
}
}
if (! m) {
devolver falso;
}
}
devolver verdadero;
}
módulo.exports = function imageInfo (buffer, ruta) {
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)) return imageInfopng (buffer);
if (checksig (buffer, 0, jpgsig)) return imageInfoJpg (buffer);
if (checksig (buffer, 0, gifsig)) return imageInfogif (buffer);
if (checksig (buffer, 0, swfsig)) return imageInfoswf (buffer);
devolver falso;
};