порядок следования байт в Java-машине?
От: app_error Украина http://www.bestsell.kiev.ua
Дата: 07.03.07 06:47
Оценка:
Есть у меня задача, в которой из файла я должен читать 4-байта длины записи, а потом, согласно этой длине саму запись. Записаны байты в "серверном" порядке, так как файл генерируется на mainframe. на Pascal (IA32) я получал длину файла следующим образом:

var buf: array [0..3]of byte;
len: integer;
begin
mfread(buf);
len := buf[3] + buf[2] shl 8 + buf[1] shl 16 + buf[0] shl 24;
end;

Пробую также делать на java:

byte[] buf = new byte[4];
int len;

mfread(buf);
len = ((int)buf[3]) + (((int)buf[2]) << 8) + (((int)buf[1]) <<16) + (((int)buf[0]) << 24;

Правильный результат получается в некоторых случаях, в некоторых случаях получается отрицательный результат. Подскажите порядок следования байт в типе int. Или может у меня еще где ошибка? Зависит ли порядок следования байт в java-машине от аппаратной платформы?
Re: порядок следования байт в Java-машине?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 07.03.07 07:29
Оценка:
Здравствуйте, app_error, Вы писали:

_>...

_>Правильный результат получается в некоторых случаях, в некоторых случаях получается отрицательный результат. Подскажите порядок следования байт в типе int. Или может у меня еще где ошибка? Зависит ли порядок следования байт в java-машине от аппаратной платформы?

Байт-код имеет один и тот же формат на всех платформах.
Ты приведи лучше пример, где у тебя не работает — что-то вида:

byte[] b = {1, 2, 3, 4};
int result = 0;
for (int i = 0, j = 0; i < b.length; ++i, j += 8) {
    result |= (b[i] << j);
}
System.out.println("result = " + result);
http://denis-zhdanov.blogspot.com
Re: порядок следования байт в Java-машине?
От: GarryIV  
Дата: 07.03.07 07:31
Оценка: 3 (1)
Здравствуйте, app_error, Вы писали:

_>Правильный результат получается в некоторых случаях, в некоторых случаях получается отрицательный результат. Подскажите порядок следования байт в типе int. Или может у меня еще где ошибка? Зависит ли порядок следования байт в java-машине от аппаратной платформы?


http://www.javaworld.com/javaworld/jw-09-1996/jw-09-bytecodes.html?page=2
WBR, Igor Evgrafov
Re[2]: порядок следования байт в Java-машине?
От: app_error Украина http://www.bestsell.kiev.ua
Дата: 07.03.07 07:45
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, app_error, Вы писали:


_>>Правильный результат получается в некоторых случаях, в некоторых случаях получается отрицательный результат. Подскажите порядок следования байт в типе int. Или может у меня еще где ошибка? Зависит ли порядок следования байт в java-машине от аппаратной платформы?


GIV>http://www.javaworld.com/javaworld/jw-09-1996/jw-09-bytecodes.html?page=2


Спасибо!
Re: порядок следования байт в Java-машине?
От: app_error Украина http://www.bestsell.kiev.ua
Дата: 07.03.07 09:22
Оценка:
Вот такое правильное решение

data_length = (((int)len_buf[3]) & (0x000000FF)) +
((((int)len_buf[2]) &(0x000000FF)) << 8) +
((((int)len_buf[1]) & (0x000000FF)) << 16) +
((((int)len_buf[0]) & (0x000000FF)) << 24);

Как оказалось — проблема в отсутствии беззнаковых типов в java.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.