CAN DATA Discrepancy Between UNO & MEGA

It appears you are just reading and writing data without checking if it is there. Try this for receive:

  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer

Do a similar thing for transmit, those lines I believe are in the examples with the library.
If you are not waiting for the full data to arrive you will be getting garbage (probably from last read) in the buffer.
The Init\ pin goes low when data is received but is not involved with transmit.