This was a bug found in Okapi, but I believe Zint has the same issue: the code block in the dm200encode function which handles ECI (when ECI > 3) updates "target" and "tp", but doesn't update the "binary" string. This corrupts the "binary" string relative to the rest of the internal state.
Zint code block in question:
https://sourceforge.net/p/zint/code/ci/master/tree/backend/dmatrix.c#l577
Fix in Okapi:
https://github.com/woo-j/OkapiBarcode/commit/8b0d522bf30a906c478f94c12a70defd7e610c01
Thank you, Daniel. This has now been added to Zint.