2012-12-24 38 views
1

我坚持,而试图在节目中提到的C函数convertCNGFileToJPGFile转换cng2jpg.c转换C函数对Perl

我一直在试图写在Perl一样,但没有与十六进制,包足够的诀窍并解压缩函数。

真的很感激,如果有人能在Perl如下所述写类似的代码。

while ((bytesRead = fread(buffer, 1, kBufferSize, inputFile))) { 
    if (!isValidCNG) { 
     if (bytesRead < 11 || strncmp("\xa5\xa9\xa6\xa9", (char *)(buffer + 6), 4)) { 
      fprintf(stderr, "%s does not appear to be a valid CNG file\n", inputFileName); 
      return 0; 
     } 
     isValidCNG = 1; 
    } 
    for (size_t i = 0; i < bytesRead; i++) 
     buffer[i] ^= 0xEF; 
    size_t bytesWritten = fwrite(buffer, 1, bytesRead, outputFile); 
    if (bytesWritten < bytesRead) { 
     fprintf(stderr, "Error writing %s\n", outputFileName); 
     return 0; 
    } 
} 

在此先感谢。

+3

做些什么码你有在Perl? – squiguy

+0

如果您只是将其重写为在Perl程序中使用它,请考虑[Inline :: C](https://metacpan.org/module/Inline::C)。 – Schwern

+0

或者您可以使用Perl中的许多图像处理库之一,例如[Imager](https://metacpan.org/module/Imager)。 – Schwern

回答

5

如果我读正确的代码,所有它做(除了有效性检查)与字节0xEF文件中的异或每一字节(即翻转所有,但每个字节的第五个最低位)。在Perl中,你可以实现与:

local $/ = \(2**16); # ignore line breaks, read in 64 kiB chunks 
while (<>) { 
    $_ ^= "\xEF" x length; 
    print; 
} 

有效性检查只是检查输出实际上是一个有效的JPEG文件—具体而言,7日到输出文件的10个字节包含口令字"JFIF"(当与0xEF异或时变为"\xa5\xa9\xa6\xa9")。一般情况下,除非您希望频繁地将这些代码运行在实际不是CNG文件的文件上,否则我不会为此而烦恼,因为之后检查输出的有效性会更容易。如果您(此外,检查将,如果解码后的文件实际上是一个Exif JPEG图像,它有神奇的字"Exif",而不是失败)

要包括的检查,这样的事情应该这样做:

local $/ = \(2**16); # ignore line breaks, read in 64 kiB chunks 
while (<>) { 
    $_ ^= "\xEF" x length; 
    die "Not a valid CNG file" if $. == 1 and not /^.{6}(JFIF|Exif)/s;   
    print; 
} 

诗篇。如果此代码运行速度太慢,我建议两种可能的改进:1)使用一个更大的缓冲区,和b)预分配0xEF的面具字节每次重建它的飞行,而不是:

local $/ = \(2**20); # ignore line breaks, read in 1 MiB chunks 
my $mask = "\xEF" x $$/; 
while (<>) { 
    $_ ^= substr($mask, 0, length); 
    die "Not a valid CNG file" if $. == 1 and not /^.{6}(JFIF|Exif)/s;   
    print; 
} 
+0

非常感谢它是工作。 –