On Mon, Feb 08, 2010 at 12:47:50AM +0100, Ronny Klier wrote:
> I think there is a bug in label encoding in Format6Encoder. For some  
> string length the last encoded byte is not stored.
>
> E.g. having a string "10007" the encoded byte buffer looks like this
>
> [0]   [0x86]  
> [1]   [0x8]   
> [2]   [0x20]  
> [3]   [0x9f]  
> [4]   [0xf0]  
>
> The number of stored bytes is 4. So the 0xf0 will not show up in the  
> final image file.

> Index: Format6Encoder.java
> ===================================================================
> --- Format6Encoder.java       (Revision 1541)
> +++ Format6Encoder.java       (Arbeitskopie)
> @@ -86,7 +86,7 @@
>  
>               buf = put6(buf, off++, 0xff);
>  
> -             int len = ((off - 1) * 6) / 8 + 1;
> +             int len = (int)Math.ceil((off * 6) / 8.0);

You can do this with integer math, truncating division.
Your example was off=6 (5 chars and the end-of-string code),
and I suppose we would get len=4 instead of 5:

                (6-1)*6 / 8 + 1 = 30/8 + 1 = 3.75 + 1 = 4

If you want to round up to full blocks, the normal trick is to
add divisor-1 before dividing, like this:

                int len = ((off - 1) * 6 + 7) / 8 + 1 = 4.625 + 1 = 5

I don't know if the off-1 and the +1 are correct.  An integer version
of your formula would also work in this case:

                int len = (off * 6 + 7) / 8 = 43/8 = 5.375 = 5

This formula is clear to me: it will clearly convert the "off" 6-byte chars
(including the end-of-string code) to the number of required 8-bit octets.

Best regards,

        Marko
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to