On Sun, Nov 23, 2008 at 08:29, loody <[EMAIL PROTECTED]> wrote:
> 2008/11/23 Chas. Owens <[EMAIL PROTECTED]>:
>>
>>
>> On Nov 23, 2008, at 2:52, loody <[EMAIL PROTECTED]> wrote:
>>
>>> Dear all:
>>> The prototype of read is
>>> read FILEHANDLE,SCALAR,LENGTH
>>> ex:
>>> read PATTERN, $line, 1920;
>>>
>>> that means the $line will content 1920 bytes.
>>> if I want to modify the byte offset 720 of $line, it seems impossible,
>>
>> But happily it isn't. You have several choices, but without more
>> information I would suggest substr*:
>>
>> substr($line, 720, 1) = $new_byte;
>>
>> Or
>>
>> substr($line, 720, 1, $new_byte);
> Hi:
> thanks for your kind help.
> I apologize for not explain my problem detail.
> Below is my source code:
> $end_gold=sysread GOLDEN, $tmp_gold, $image_resolution_w[$idx];
> $end_result=sysread RESULT, $tmp_result, $image_resolution_w[$idx];
> if($tmp_gold ne $tmp_result)
> {
> print CMPREPORT "Frame index: $frame, UV line:
> $tmp_height error\n";
> }
> As you can see, I only can tell which line of UV part in both images
> get different.
> Right now I want to high light the error part of this 2 lines as 0xFF,
> such that I can see the error part as bright red.
> Your suggestion is good, but the difficulties comes I don't exactly
> know where the error offset of these 2 lines.
> I got a stupid idea as read 2 files byte to byte to 2 arrays and
> compare them one by one.
> But it is really un-efficient.
>
>
>>
>> Depending on which you prefer. Also, if you are going to be working with
>> raw bytes it is a good idea to say
>>
>> use bytes;
>>
>> At the top of your program to avoid unicode issues.
>
> I have look the page you give to me, http://perldoc.perl.org/bytes.html
> it seems I may not need it in my case, since I compare 2 lines of 2
> images and rewrite the error part.
> If I am wrong, please let me know.
> appreciate your help,
> miloody
>
Try this. The best way to run it is
./script | less -R
The -R on less preserves the meaning of the ANSI color escapes.
#!/usr/bin/perl
use strict;
use warnings;
#make string functions work with a byte at a time
#rather than one character at a time (some characters
#are more than one byte)
use bytes;
use constant SAME => "\x{03}0"; #default terminal color
use constant DIFF => "\x{03}5"; #bold red
use constant GOLDEN_BUT_NOT_RESULT => "\x{03}7"; #bold blue
use constant RESULT_BUT_NOT_GOLDEN => "\x{03}13"; #bold yellow
use constant WIDTH => 40;
#ensure we open all files as binary rather than
#some encoding or in crlf modes.
use open IN => ":bytes";
use Color::Output;
Color::Output->Init;
die "usage: $0 golden result\n" unless @ARGV == 2;
open my $golden_fh, "<", $ARGV[0]
or die "could not open golden file $ARGV[0]: $!";
open my $result_fh, "<", $ARGV[1]
or die "could not open result file $ARGV[1]: $!";
local $/ = \1; #read one byte at a time
my $width = 0;
while (1) {
rest_are_diff($result_fh, 1) unless defined(my $golden = <$golden_fh>);
rest_are_diff($golden_fh, 0) unless defined(my $result = <$result_fh>);
my $color = $golden eq $result ? SAME : DIFF;
#I am giving $result preference when they are different
#this is abritary
print_byte($color, $result);
}
{
my $width = 0;
sub print_byte {
my ($color, $byte) = @_;
cprintf "$color %02x\x{03}0", ord($byte);
#printf "%02x ", ord($byte);
if (++$width > WIDTH) {
$width = 0;
print "\n";
}
}
}
sub rest_are_diff {
my ($fh, $which) = @_;
my $color = $which ? GOLDEN_BUT_NOT_RESULT : RESULT_BUT_NOT_GOLDEN;
print_byte($color, $_) while <$fh>;
print "\n";
exit;
}
Of course, I think I would prefer something more like this:
#!/usr/bin/perl
use strict;
use warnings;
#make string functions work with a byte at a time
#rather than one character at a time (some characters
#are more than one byte)
use bytes;
#ensure we open all files as binary rather than
#some encoding or in crlf modes.
use open IN => ":bytes";
die "usage: $0 golden result\n" unless @ARGV == 2;
open my $golden_fh, "<", $ARGV[0]
or die "could not open golden file $ARGV[0]: $!";
open my $result_fh, "<", $ARGV[1]
or die "could not open result file $ARGV[1]: $!";
local $/ = \1; #read one byte at a time
my $width = 0;
while (1) {
rest_are_diff($result_fh, 1) unless defined(my $golden = <$golden_fh>);
rest_are_diff($golden_fh, 0) unless defined(my $result = <$result_fh>);
unless ($golden eq $result) {
printf "at offset $. bytes differed golden 0x%02x result
0x%02x\n",
ord $golden, ord $result;
}
}
sub rest_are_diff {
my ($fh, $which) = @_;
printf "not in " . ($which ? "golden" : "result") . " at offset $.:
0x%02x\n", ord $_ while <$fh>;
exit;
}
--
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/