private static int X12Encodation(byte[] text, int textOffset, int textLength, byte[] data, int dataOffset, int dataLength) {
int ptrIn, ptrOut, count, k, n, ci;
byte c;
if (textLength == 0)
return 0;
ptrIn = 0;
ptrOut = 0;
byte[] x = new byte[textLength];
count = 0;
for (; ptrIn < textLength; ++ptrIn) {
int i = x12.IndexOf((char)text[ptrIn + textOffset]);
if (i >= 0) {
x[ptrIn] = (byte)i;
++count;
}
else {
x[ptrIn] = 100;
if (count >= 6)
count -= (count / 3) * 3;
for (k = 0; k < count; ++k)
x[ptrIn - k - 1] = 100;
count = 0;
}
}
if (count >= 6)
count -= (count / 3) * 3;
for (k = 0; k < count; ++k)
x[ptrIn - k - 1] = 100;
ptrIn = 0;
c = 0;
for (; ptrIn < textLength; ++ptrIn) {
c = x[ptrIn];
if (ptrOut >= dataLength)
break;
if (c < 40) {
if (ptrIn == 0 || (ptrIn > 0 && x[ptrIn - 1] > 40))
data[dataOffset + ptrOut++] = (byte)238;
if (ptrOut + 2 > dataLength)
break;
n = 1600 * x[ptrIn] + 40 * x[ptrIn + 1] + x[ptrIn + 2] + 1;
data[dataOffset + ptrOut++] = (byte)(n / 256);
data[dataOffset + ptrOut++] = (byte)n;
ptrIn += 2;
}
else {
if (ptrIn > 0 && x[ptrIn - 1] < 40)
data[dataOffset + ptrOut++] = (byte)254;
ci = text[ptrIn + textOffset] & 0xff;
if (ci > 127) {
data[dataOffset + ptrOut++] = (byte)235;
ci -= 128;
}
if (ptrOut >= dataLength)
break;
data[dataOffset + ptrOut++] = (byte)(ci + 1);
}
}
c = 100;
if (textLength > 0)
c = x[textLength - 1];
if (ptrIn != textLength || (c < 40 && ptrOut >= dataLength))
return -1;
if (c < 40)
data[dataOffset + ptrOut++] = (byte)(254);
return ptrOut;
}