Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Преобразование типов Добавлено: 16.07.09 14:06  

Автор вопроса:  inferno | Web-сайт: www.streamcash.tk
Всем привет!
Столкнулся с проблемой:
Записываю в файл число в long типе. Далее считываю файл в байтовый массив. В конечном результате я должен получить тоже long число.

Привожу кусок своего кода:

''''''''''''''''''
bt() и есть байтовый массив
''''''''''''''''''

t = 0
For e = 3 To 0 Step -1
c = 256 ^ e
t = t + c * bt(e)
Next e
o = t
MsgBox o

Всё замечательно работает с положительными значениями, но когда число записывается в файл как отрицательное выдатся ошибка. Как мне поступить с отрицательными числами.

Очень нужна помощь!

Буду очень благодарен помощи!

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 16.07.09 15:33
  1. Private Function Convert4Bytes2Long(v0 As Byte, v1 As Byte, v2 As Byte, v3 As Byte) As Long
  2.  
  3.     If v0 > 127 Then Convert4Bytes2Long = -(RGB(v3, v2, v1) + (v0 - 128) * 2 ^ 24) Else Convert4Bytes2Long = (RGB(v3, v2, v1) + v0 * 2 ^ 24)
  4. End Function

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 16.07.09 23:39
RGB(v3, v2, v1)

Да вы, батенька, извращенец!

Ответить

Номер ответа: 3
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #3
Добавлено: 17.07.09 07:23
да эт не я, в инете нашел, сам офигел какие прогеры вб6 извраты))

Ответить

Номер ответа: 4
Автор ответа:
 inferno



Вопросов: 8
Ответов: 39
 Web-сайт: www.streamcash.tk
 Профиль | | #4
Добавлено: 17.07.09 07:32
Спасибо! Вот нашёл своё решение:

  1. Private Type LongByteType
  2.   b1 As Byte
  3.   b2 As Byte
  4.   b3 As Byte
  5.   b4 As Byte
  6. End Type
  7.  
  8. Private Type LongType
  9. l As Integer
  10. End Type
  11.  
  12. Private LongRec As LongByteType
  13. Private MyLong As LongType
  14.  
  15.  
  16. Public Function ByteArraytoLong(pArray As Variant) As Long
  17.   LongRec.b1 = pArray(0)
  18.   LongRec.b2 = pArray(1)
  19.   LongRec.b3 = pArray(2)
  20.   LongRec.b4 = pArray(3)
  21.   
  22.   LSet MyLong = LongRec
  23.   ByteArraytoLong = MyLong.l
  24. End Function
  25.  
  26. Private Sub Command1_Click()
  27.   Dim ln As Integer
  28.   ln = -12345
  29.   Open "C:\long" For Binary As #1
  30.     Put #1, , ln
  31.   Close #1
  32. End Sub
  33.  
  34. Private Sub Command2_Click()
  35.   Dim bt() As Byte
  36.   Open "C:\long" For Binary As #1
  37.     ReDim bt(FileLen("C:\long"))
  38.     Get #1, , bt()
  39.   Close #1
  40.   MsgBox ByteArraytoLong(bt())
  41. End Sub

Ответить

Номер ответа: 5
Автор ответа:
 inferno



Вопросов: 8
Ответов: 39
 Web-сайт: www.streamcash.tk
 Профиль | | #5
Добавлено: 17.07.09 07:33
Есть ещё вопрос!
Как теперь из байтового массива преобразовать например в Single или Double.

Буду благодарен за оказанную мне помощь!

Ответить

Номер ответа: 6
Автор ответа:
 inferno



Вопросов: 8
Ответов: 39
 Web-сайт: www.streamcash.tk
 Профиль | | #6
Добавлено: 17.07.09 08:10
Так, решение найдено!

  1. Private Declare Sub CopyMemory Lib "KERNEL32" _
  2.     Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  3.  
  4. Function ByteArrayToSingle(ByRef aByte() As Byte) As Single
  5.     CopyMemory ByteArrayToSingle, aByte(0), 4
  6. End Function
  7.  
  8. Sub TEST1()
  9. Dim aSing As Single
  10. Dim aByte(3) As Byte
  11.  
  12.     Open "C:\single" For Binary As #2
  13.       Get #2, , aByte()
  14.     Close #2
  15.          ' aByte(3) = &HC1  'Sign bit and MS 7 bits of exponent
  16.          ' aByte(2) = &H2   'LSb of exponent and MS 7 bits of Significand
  17.         '  aByte(1) = &H3
  18.         '  aByte(0) = &H4   'LS 8 bits of Significand
  19.    
  20.     aSing = ByteArrayToSingle(aByte)
  21.     MsgBox aSing
  22. End Sub
  23.  
  24. Private Sub Command1_Click()
  25.   TEST1
  26. End Sub
  27.  
  28. Private Sub Command2_Click()
  29. Dim sn As Single
  30.   sn = 1.569
  31.   Open "C:\single" For Binary As #1
  32.     Put #1, , sn
  33.   Close #1
  34. End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам