Here is my guess into the fray... in some cases restating or consolidating what others have said but in context.
The source data is 16 bit fixed point format. This has a smaller range than float or double but has more precision than 16 bit floating point would have had. Here, 8 signed bits are given to the whole number portion and 8 bits are given to the decimal portion.
For those unfamiliar with fixed point representation, this is similar to keeping monetary values as integer "cents" while dividing by 100 to present display "dollars".
LSB = (0XFF & (int)ipPacket[index]);
double temp = LSB/256.0;
In the above, the first byte is turned into the decimal portion of the value using floating point division. LSB/256.0 will produce a double value between 0.0 and 0.99609375.
MSB = (byte)(0XFF & (byte)ipPacket[index+1]);
The above code is supposed to be normalizing the second byte. If ipPacket is a byte[] array then this isn't doing anything as the sign bit was fine already. ipPacket[index+1] would have already been between -128 and 127. The code only makes sense if ipPacket is a non-byte array and even then it's a bit overzealous in its casting since the & 0XFF is going to promote the value to an integer anyway... right before casting it back to byte.
Given the unnecessary (double) cast in the last line of the original code, I'm going to suspect some of the above may be unneeded also.
If ipPacket is a byte[] array then:
MSB = ipPacket[index+1];
Should be fine. If ipPacket is not a byte[] array then the following should still be sufficient:
MSB = (byte)(0xFF & ipPacket[index+1]);
As said by others, this last bit then combines the whole number and decimal portions:
double output = (double)(MSB + temp);
ConvCurrentPhaseR[doubleArrayIndex] = (double)(output);
Though it is important to note that the decimal portion is added to the whole number portion. This means that MSB = -1 and LSB = 128 would result in -0.5 and not -1.5 as one might initially expect.