A
Aaron Smith
I am trying to do some parsing of binary data.
Here is the psuedo code that parses what i'm looking for:
private int readInteger() throws IOException {
int n = 0;
int b = in.readUnsignedByte();
int result = 0;
while ((b & 0x80) != 0 && n < 3) {
result <<= 7;
result |= (b & 0x7f);
b = in.readUnsignedByte();
n++;
}
if (n < 3) {
result <<= 7;
result |= b;
} else {
/* Use all 8 bits from the 4th byte */
result <<= 8;
result |= b;
/* Check if the integer should be negative */
if ((result & 0x10000000) != 0) {
/* and extend the sign bit */
result |= 0xe0000000;
}
}
return result;
}
Here is how I wrote it with Ruby:
def read_int
n = 0;
b = @input_stream.read_special(1,'C')
result = 0
while((b & 0x80) != 0 && n < 3)
result <<= 7
result |= (b & 0x7f)
b = @input_stream.read_special(1,'C')
n = n + 1
end
if (n < 3)
result <<= 7
result |= b
else
# Use all 8 bits from the 4th byte
result <<= 8
result |= b
#Check if the integer should be negative
if ((result & 0x10000000) != 0)
# and extend the sign bit
result |= 0xe0000000
end
end
STDOUT.puts "READ INT: #{result}"
return result
end
When translating the Pseudo Code to PHP, it's verbatim except for
syntax. With ruby, I think i've found the problem with it not parsing
correclty. the |= operator. With PHP
$i |= 0xe0000000; //= -536870912
Now with Ruby:
i |= 0xe000000 #= true
Any ideas on a solution?
thanks.
Here is the psuedo code that parses what i'm looking for:
private int readInteger() throws IOException {
int n = 0;
int b = in.readUnsignedByte();
int result = 0;
while ((b & 0x80) != 0 && n < 3) {
result <<= 7;
result |= (b & 0x7f);
b = in.readUnsignedByte();
n++;
}
if (n < 3) {
result <<= 7;
result |= b;
} else {
/* Use all 8 bits from the 4th byte */
result <<= 8;
result |= b;
/* Check if the integer should be negative */
if ((result & 0x10000000) != 0) {
/* and extend the sign bit */
result |= 0xe0000000;
}
}
return result;
}
Here is how I wrote it with Ruby:
def read_int
n = 0;
b = @input_stream.read_special(1,'C')
result = 0
while((b & 0x80) != 0 && n < 3)
result <<= 7
result |= (b & 0x7f)
b = @input_stream.read_special(1,'C')
n = n + 1
end
if (n < 3)
result <<= 7
result |= b
else
# Use all 8 bits from the 4th byte
result <<= 8
result |= b
#Check if the integer should be negative
if ((result & 0x10000000) != 0)
# and extend the sign bit
result |= 0xe0000000
end
end
STDOUT.puts "READ INT: #{result}"
return result
end
When translating the Pseudo Code to PHP, it's verbatim except for
syntax. With ruby, I think i've found the problem with it not parsing
correclty. the |= operator. With PHP
$i |= 0xe0000000; //= -536870912
Now with Ruby:
i |= 0xe000000 #= true
Any ideas on a solution?
thanks.