Формат Currency 6 байт

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Формат Currency 6 байт

Сообщение MOV » 18.03.2005 (Пт) 11:47

В VB этот формат занимает 8 байт, но есть файл, где данные денежного формата хранятся в 6-тибайтном поле. Считываю это поле побайтно, создав новый тип MyCurrency к примеру. Как потом эти 6-байт обратно в цифирь закатать? Сам формат как выглядит? Было бы просто, если бы это было целое число без копеек, но где-то должен быть разделитель на копейки? Пока буду эксперементировать, подставляя определенные значения, там станет понятно, но может кто-то уже знает?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.03.2005 (Пт) 11:52

Считывай байты (например, в байтовый массив из шести элементов) и загоняй в Currency с помощью CopyMemory (или LSet).
Lasciate ogni speranza, voi ch'entrate.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 18.03.2005 (Пт) 18:00

Может подскажете как именно? Уже по разному байты переставлял никак.

Да в словаре для драйвера к этому файлу пишется:

' Decimal field for CURRENCY (9999= home decimal)


Это видимо что-то про десятичную часть, но что именно не пойму. Еще точно известно, что в этом поле денежные суммы и еще в том же словаре к этому полю:

CURR
416
6


Где 416 - смещение и 6 длина поля.


А пока считываю побайтно в масив из 6-ти элементов.
Потом:

Код: Выделить всё
Dim NewCur As Currency
Dim bt(5) As Byte
CopyMemory NewCur, bt(0), 6


Результат:
NewCur=17552281248,5635
Если загнать этот массив с байтами в обратном порядке получается
NewCur=371466165,5455
А реально в этом поле должно быть 15000 (это если через драйвер смотреть). Можно, конечно так и юзать драйвер, но интересно написать что-то в обход его.
Смещение точное, т.к. поля которые идут до и после этого считываются нормально.

Может кто-то хотя бы знает формат побайтно этого Сurrency 6 байт? Какие байты - знак, какие дробная часть или там разделитель какой? :oops:
Последний раз редактировалось MOV 18.03.2005 (Пт) 18:11, всего редактировалось 2 раз(а).

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.03.2005 (Пт) 18:05

на правах прохожего...

А разве Currency не 4 байта?!??!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 18.03.2005 (Пт) 18:08

Sebas, Нет. Сurrency в VB - 8 байт, а в этом файле именно 6 байт.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 19.03.2005 (Сб) 0:37

Какие-нить еще примеры значений приведи, окромя целочисленного :). И побольше, побольше. И еще не помешало бы, если б ты указал для какого-нить дробного числа реальное содержимое байтов.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 19.03.2005 (Сб) 10:15

Допустим, реальное значение:
6059845068,98

Тогда по байтам (вот как видите, так они и располагаются в файле слева направо в таком же положении передаю их в currency. ):
№ байта 5 4 3 2 1 0
значение 5 19 196 125 23 141

Врезультате CopyMemory в currency
Показывает: 15513203376,6149

Аналогично реальное значение:
156000,95

По байтам:
№ байта 5 4 3 2 1 0
значение 3 223 9 238 0 0

Показывает: 399362,4323

Такая вот ерунда. Может у кого-то есть инфа из ассемблера, думаю, там типы должны подробно описываться (по байтам).

Да. Еще. Если например реально записано 15000, то если передавать байты
с четвертого по второй включительно, получается 150, то есть близко к истине, если будет 10000, то выведет 100.

И еще. Там где реально просто нули:

По байтам считывается:
№ байта 5 4 3 2 1 0
значение 0 184 3 0 163 159

Показывает: 17552242872,9344

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 19.03.2005 (Сб) 14:48

Просто проверяю например:

Код: Выделить всё
Private Type Cb
    b(7) As Byte
End Type
   
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

' Сначала записываю тип currency  в файл

    Dim CurrencyS As Currency
    Dim fn As Integer: Dim fh As Integer
    CurrencyS = 125
    fn = FreeFile
        Open "C:\apvend'r" For Random As fn Len = 8
        Put #fn, 1, CurrencyS
    Close fn
   
' потом считываю это значение в байтовый массив
' и CopyMemory пихаю обратно в Currency

    Dim MyCur As Cb
    fh = FreeFile
        Open "C:\apvend'r" For Random As fh Len = 8
        Get #fh, 1, MyCur
    Close fh
    CopyMemory CurrencyS, MyCur.b(0), 8
   
    Debug.Print CurrencyS & "  0/" & MyCur.b(0) & "  1/" & MyCur.b(1) & _
                            "  2/" & MyCur.b(2) & "  3/" & MyCur.b(3) & _
                            "  4/" & MyCur.b(4) & "  5/" & MyCur.b(5) & _
                            "  6/" & MyCur.b(6) & "  7/" & MyCur.b(7)
End Sub


Все работает нормально. Можете проверить. :cry:
Правда сам формат странный все-таки (посмотрите значения байтов)
Если записываем значение 1, то задействуются два байта, хотя вполне хватило бы и одного и так далее. Нигде не могу найти внутреннюю структуру Currency. Неужели это так сложно?. :oops:
А вот это из 6-ти байт в восемь не хочет. Уже смещал по разному.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 19.03.2005 (Сб) 17:00

Блин? достать бы формат этого Currency, так проще сделать пребразование вручную по байтам без CopyMemory.
Остается эксперементировать. :x

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.03.2005 (Сб) 17:27

MOV писал(а):с четвертого по второй включительно, получается 150, то есть близко к истине, если будет 10000, то выведет 100.

Поясни, что это значит.
Currency это на самом деле не дробное число, а число с фиксированной запятой. Т.е. оно по сути является целым числом, просто десятичная точка расположена не в последней позиции, а на 4 позиции (для VB) левее. А первый бит наверняка указывает знак.
Форматы чисел описываются в спецификациях IEEE, но точный номер не скажу, не помню.
Lasciate ogni speranza, voi ch'entrate.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 19.03.2005 (Сб) 17:50

Поясни, что это значит.

alibek, как это ни смешно, не могу объяснить, чтобы было ясно. Все равно, если бы мне задали такой вопрос, ответил бы - надо смотреть, - так трудно помочь. Спасибо за инфу про IEEE, поищу еще там. На счет знака и точки догадываюсь, но пока без результатов.
Хотя... Вот именно, попробую отбросить справа 4 бита (0,9999) и слева 1 бит (знак). Посмотрю, что выйдет.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.03.2005 (Сб) 17:56

Погляди здесь:
http://support.microsoft.com/default.as ... n-us;51414

Помоему как раз то, что нужно.
Lasciate ogni speranza, voi ch'entrate.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 19.03.2005 (Сб) 18:51

alibek, да посмотрел, но с 8-мью байтной Currency все понятно и без этого примера, с 6-тьюбайтной никак не разберусь.
На
http://www.ieee.org как таковой инфы инфы не нашел :oops:
Где-то видел сайт украинский по моему, давно, где документов IEEE было просто море. Сейчас не нахожу.
Ладно, спасибо за помошь. Буду рыться.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 155

    TopList