2017-02-14 2 views
0

Я пытаюсь разобрать двоичный файл, содержащий значения. В спецификациях сказано, что каждое значение равно , представленному как 2-байтовое целое число в формате дополнения 2. Я чтения файла в массив байтов называется «данные»:java - чтение 2 байтовых целых чисел в дополнении 2 из двоичного файла в целое число

int i = (data[i] & 0xff) | (short) (data[i+1] << 8); 

Значения выглядят хорошо, однако, когда я пытаюсь записать их обратно в файл:

byte a = (byte)((tempInt >> 8) & 0xff); 
byte b = (byte)(tempInt & 0xff); 

«tempInt», являющегося значение в int.

Когда я прочитал в файле, который я написал, не все значения одинаковы. Некоторые из них, но не все.

Я что-то упустил?

ОБНОВЛЕНИЕ: Я собираю значения для сравнения. Верхняя половина - это значения, которые я читаю из файла. Нижняя половина - это значения, которые я прочитал из файла, затем написал новый файл и затем снова прочитал. plot Я думаю, что графики выглядят слишком схожими, чтобы быть совершенно неправильными.

UPDATE # 2: байт я прочитал из входного файла:

0, 0, 59, 36, 40, 36, 23, 36, 54, 36, 54, 36, 41, 36, 46, 36, 50, 36, 52, 36, 79, 36, 79, 36, 66, 36, 65, 36, 58, 36, 58, 36, 58, 36, 45, 36, 51, 36, 65, 36, 65, 36, 76, 36, 78, 36, 69, 36, 54, 36, 68, 36, 86, 36, 85, 36, 81, 36, 81, 36, 80, 36, 84, 36, 84, 36, 80, 36, 82, 36, 85, 36, 81, 36, 80, 36, 75, 36, 75, 36, 79, 36, 91, 36, 83, 36, 64, 36, 71, 36, 79, 36, 56, 36, 38, 36, 47, 36, 51, 36, 41, 36, 48, 36, 63, 36, 56, 36, 50, 36, 57, 36, 67, 36, 78, 36, 81, 36, 67, 36, 81, 36, 81, 36, 82, 36, 69, 36, 66, 36, 66, 36, 54, 36, 39, 36, 78, 36, 78, 36, 78, 36, 62, 36, 57, 36, 73, 36, 75, 36, 69, 36, 76, 36, 81, 36, 74, 36 

Преобразованных целых чисел:

0, 9275, 9256, 9239, 9270, 9270, 9257, 9262, 9266, 9268, 9295, 9295, 9282, 9281, 9274, 9274, 9274, 9261, 9267, 9281, 9281, 9292, 9294, 9285, 9270, 9284, 9302, 9301, 9297, 9297, 9296, 9300, 9300, 9296, 9298, 9301, 9297, 9296, 9291, 9291, 9295, 9307, 9299, 9280, 9287, 9295, 9272, 9254, 9263, 9267, 9257, 9264, 9279, 9272, 9266, 9273, 9283, 9294, 9297, 9283, 9297, 9297, 9298, 9285, 9282, 9282, 9270, 9255, 9294, 9294, 9294, 9278, 9273, 9289, 9291, 9285, 9292, 9297, 9290 

байт я считываемые из файла, который я написал из выше значения:

32, 0, 0, 36, 59, 36, 40, 36, 23, 36, 54, 36, 54, 36, 41, 36, 46, 36, 50, 36, 52, 36, 79, 36, 79, 36, 66, 36, 65, 36, 58, 36, 58, 36, 58, 36, 45, 36, 51, 36, 65, 36, 65, 36, 76, 36, 78, 36, 69, 36, 54, 36, 68, 36, 86, 36, 85, 36, 81, 36, 81, 36, 80, 36, 84, 36, 84, 36, 80, 36, 82, 36, 85, 36, 81, 36, 80, 36, 75, 36, 75, 36, 79, 36, 91, 36, 83, 36, 64, 36, 71, 36, 79, 36, 56, 36, 38, 36, 47, 36, 51, 36, 41, 36, 48, 36, 63, 36, 56, 36, 50, 36, 57, 36, 67, 36, 78, 36, 81, 36, 67, 36, 81, 36, 81, 36, 82, 36, 69, 36, 66, 36, 66, 36, 54, 36, 39, 36, 78, 36, 78, 36, 78, 36, 62, 36, 57, 36, 73, 36, 75, 36, 69, 36, 76, 36, 81, 36 

Преобразованных целые числа:

32, 9216, 9275, 9256, 9239, 9270, 9270, 9257, 9262, 9266, 9268, 9295, 9295, 9282, 9281, 9274, 9274, 9274, 9261, 9267, 9281, 9281, 9292, 9294, 9285, 9270, 9284, 9302, 9301, 9297, 9297, 9296, 9300, 9300, 9296, 9298, 9301, 9297, 9296, 9291, 9291, 9295, 9307, 9299, 9280, 9287, 9295, 9272, 9254, 9263, 9267, 9257, 9264, 9279, 9272, 9266, 9273, 9283, 9294, 9297, 9283, 9297, 9297, 9298, 9285, 9282, 9282, 9270, 9255, 9294, 9294, 9294, 9278, 9273, 9289, 9291, 9285, 9292, 9297 

UPDATE # 3: Хорошо, так что я сделал небольшую версию программы, где я только что прочитал в байтах от файла превратил их в целые числа, превратил их обратно в байты и написал их в файл. Без всего формата данных. И это действительно сработало. Таким образом, проблема связана с алгоритмом, а не с байтом с преобразованием int (и обратно в байт). Я вернусь и проверю алгоритм. Спасибо за помощь :)

ответ

2

Да - вы чтение их в прямой порядок байтов (первое значение является наименее важным), но вы писать их в большом формате обратного порядка (первое значение является наиболее важным), предположив, что вы пишете a, затем b.

Только в обратном порядке, когда вы пишете их, предполагая, что файл предназначается, чтобы быть прямой порядок байтов:

byte a = (byte)(tempInt & 0xff); 
byte b = (byte)((tempInt >> 8) & 0xff); 
+0

спасибо за ответ :) Я изменил порядок, однако значения все еще немного отличаются. i plottet значения для сравнения в обновлении – cmplx96

+0

@ cmplx96: Графики таких графиков не так полезны, как предоставление входных и выходных данных * чисел *, в идеале с [mcve]. (Мы очень мало знаем о том, как этот граф был действительно сгенерирован - что еще есть за пределами «читать номер, записать число».) –

+0

Я добавил значения. Больше ничего. Я прочитал файл, сохранил его в целочисленном виде, а затем сохранил его в байтах. – cmplx96

0

Попробуйте это:

int i = ((short)data[i] & 0xff) | ((short)data[i+1] << 8); 

Как data является массивом byte значение data[i+1] << 8 осуществляется по 8 бит, что дает нулевое значение. Я просто выбрал значение data[i+1] в shrt перед тем, как сдвинуть влево.

+0

Параметр '<<' оператор будет выполнять двоичный цифровой продвижение, поэтому сдвиг никогда не делается на байт все равно. Например: 'byte b = 1; int x = b << 8; System.out.println (x); 'prints 256. –

Смежные вопросы