нужен разделитель

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

нужен разделитель

Сообщение Sirik » 13.03.2006 (Пн) 11:28

нужен уникальный разделитель строки.
я подумал о 0, но есть вопросик: встречается ли он в текстовых и/или бинарных файлах?
если да, то 0 не подходит.

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

Re: нужен разделитель

Сообщение alibek » 13.03.2006 (Пн) 11:32

Sirik писал(а):или бинарных файлах?

Это шутка такая?
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 11:49

ну не правильно выразился (голова немного болит) - суть не в этом!

имелось в виде двоичные файлы (пример картинка bmp - загрузил по символьно - не было ни одного нулевого символа).

так что можно его использовать в качестве раздилителя?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.03.2006 (Пн) 11:55

ты про CHR(0) ?
не советую

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 12:19

всё про него же... поэтому и спросил, что есть сомнения
а что посоветуешь?

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

Сообщение alibek » 13.03.2006 (Пн) 12:26

Перед каждым блоком данных указывай размер.
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 12:45

не так не подходит, для меня размер имеет огромное значение!

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 13.03.2006 (Пн) 12:53

используй комбинацию...

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 14:01

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

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.03.2006 (Пн) 14:09

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


Ну а нафига тебе вообще разделитель? Из текста я так это и не понял.
Если нужно скидывать/восстанавливать данные то просто пиши на диск свой тип данных - VB сам разберется как его потом в переменную того же типа восстановить.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 14:36

вот такой формат:
строка(произвольная длина)ключ(произвольная длина)

зы. ниакакой записи на диск речь не идёт

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.03.2006 (Пн) 14:40

Sirik писал(а):вот такой формат:
строка(произвольная длина)ключ(произвольная длина)


Ну и что в этой строке храниться будет - разве ты не знаешь?
Если в ней заведомо не будет vbNullChar то используй его.
Ну а если в этой строке может быть что угодно, то может это уже и не строка, а байтовый массив?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 14:45

во, блин.
если бы я знал заранее что в строке не будет vbNullChar задавал бы я этот вопрос? наверное нет!

короче понял одно, лучше брать любой символ, котрый не втсречается в строке

всем спасибо

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.03.2006 (Пн) 14:48

Sirik писал(а):во, блин.
если бы я знал заранее что в строке не будет vbNullChar задавал бы я этот вопрос? наверное нет!


По всей видимости у тебя все-же не строка, а массив байт...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.03.2006 (Пн) 14:53

по-моему всё-таки нет.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 13.03.2006 (Пн) 20:01

Sirik писал(а):короче понял одно, лучше брать любой символ, котрый не втсречается в строке


или еще вариант... Если есть вероятность, что vbNullChar либо в строке либо в ключе попадется - кодируй их. Например, в Base64:

strBuffer = EncodeBase64(strLine) & vbNullChar & EncodeBase64(strKey)

После этого в строке гарантированно лишних NullChar не появится.

Eduard
Бывалый
Бывалый
 
Сообщения: 254
Зарегистрирован: 31.08.2003 (Вс) 17:12
Откуда: Эстония

Сообщение Eduard » 13.03.2006 (Пн) 21:57

lister :roll: а ты бы, того, не подкинул бы исходные внутренности EncodeBase64 и EncodeBase64... я бы был бы очень, был бы благодарен.
On Fatal Error Resume Next

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 14.03.2006 (Вт) 9:18

Для кодирования EncodeSrt64 Для раскодирования, соответственно, DecodeStr64


Код: Выделить всё
Option Explicit

Private m_intDecTab(255) As Integer
Private Const m_strEncTabConst As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

Public Function EncodeStr64(ByRef strInput As String) As String
  Dim i As Long
  Dim j As Integer
  Dim lngLen As Long
  Dim lngQuants As Long
  Dim intIndex As Long
  Dim strOutput As String
  Dim strLast As String
  Dim b(2) As Byte
 
  lngLen = Len(strInput)
  lngQuants = lngLen \ 3
  strOutput = String(lngQuants * 4, " ")

  For i = 0 To lngQuants - vbNull
    For j = 0 To 2
        b(j) = VBA.Asc(VBA.Mid$(strInput, (i * 3) + j + vbNull, vbNull))
    Next

    Mid(strOutput, intIndex + vbNull, 4) = EncodeQuantum(b)
    intIndex = intIndex + 4
  Next

  Select Case lngLen Mod 3
    Case 0
      strLast = vbNullString

    Case 1
      b(0) = VBA.Asc(VBA.Mid$(strInput, lngLen, vbNull))
      b(1) = 0&
      b(2) = 0&
      strLast = EncodeQuantum(b)
      strLast = VBA.Left$(strLast, 2) & "=="

    Case 2
      b(0) = VBA.Asc(VBA.Mid$(strInput, lngLen - vbNull, vbNull))
      b(1) = VBA.Asc(VBA.Mid$(strInput, lngLen, vbNull))
      b(2) = 0&
      strLast = EncodeQuantum(b)
      strLast = VBA.Left(strLast, 3) & "="
     
  End Select

  EncodeStr64 = strOutput & strLast
 
End Function




Public Function DecodeStr64(ByRef strEncoded As String) As String
  Dim d(3)        As Byte
  Dim c           As Byte
  Dim di          As Integer
  Dim i           As Long
  Dim lngLen        As Long
  Dim intIndex      As Long
 
  lngLen = Len(strEncoded)
  DecodeStr64 = String((lngLen \ 4) * 3, " ")
  Call MakeDecTab
 
  For i = vbNull To Len(strEncoded)
    c = VBA.CByte(VBA.Asc(VBA.Mid$(strEncoded, i, vbNull)))
    c = m_intDecTab(c)
 
    If c >= 0& Then
      d(di) = c
      di = di + vbNull

      If di = 4 Then
        Mid$(DecodeStr64, intIndex + vbNull, 3) = DecodeQuantum(d)
        intIndex = intIndex + 3

        If d(3) = 64 Then
          DecodeStr64 = VBA.Left(DecodeStr64, VBA.Len(DecodeStr64) - vbNull)
          intIndex = intIndex - vbNull
           
        End If

        If d(2) = 64 Then
          DecodeStr64 = VBA.Left(DecodeStr64, VBA.Len(DecodeStr64) - vbNull)
          intIndex = intIndex - vbNull
           
        End If
       
        di = 0&
         
      End If
     
    End If
   
  Next
 
End Function




Private Function EncodeQuantum(ByRef b() As Byte) As String
  Dim c As Integer

  c = SHR2(b(0)) And &H3F
  EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)

  c = SHL4(b(0) And &H3) Or (SHR4(b(1)) And &HF)
  EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)

  c = SHL2(b(1) And &HF) Or (SHR6(b(2)) And &H3)
  EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)

  c = b(2) And &H3F
  EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)
 
End Function




Private Function DecodeQuantum(ByRef d() As Byte) As String
  Dim c As Long

  c = SHL2(d(0)) Or (SHR4(d(1)) And &H3)
  DecodeQuantum = DecodeQuantum & VBA.Chr$(c)

  c = SHL4(d(1) And &HF) Or (SHR2(d(2)) And &HF)
  DecodeQuantum = DecodeQuantum & VBA.Chr$(c)

  c = SHL6(d(2) And &H3) Or d(3)
  DecodeQuantum = DecodeQuantum & VBA.Chr$(c)
   
End Function




Private Function MakeDecTab()
  Dim t As Integer
  Dim c As Integer

  For c = 0 To 255
    m_intDecTab(c) = &HFFF
  Next
 
  For c = VBA.Asc("A") To VBA.Asc("Z")
    m_intDecTab(c) = t
    t = t + vbNull
  Next
 
  For c = VBA.Asc("a") To VBA.Asc("z")
    m_intDecTab(c) = t
    t = t + vbNull
  Next
 
  For c = VBA.Asc("0") To VBA.Asc("9")
    m_intDecTab(c) = t
    t = t + vbNull
  Next


  c = Asc("+")
  m_intDecTab(c) = t
  t = t + vbNull

  c = Asc("/")
  m_intDecTab(c) = t
  t = t + vbNull
 
  c = Asc("=")
  m_intDecTab(c) = t
 
End Function




Private Function SHL2(ByVal bytValue As Byte) As Byte
    SHL2 = (bytValue * &H4) And &HFF
End Function

Private Function SHL4(ByVal bytValue As Byte) As Byte
    SHL4 = (bytValue * &H10) And &HFF
End Function

Private Function SHL6(ByVal bytValue As Byte) As Byte
    SHL6 = (bytValue * &H40) And &HFF
End Function

Private Function SHR2(ByVal bytValue As Byte) As Byte
    SHR2 = bytValue \ &H4
End Function

Private Function SHR4(ByVal bytValue As Byte) As Byte
    SHR4 = bytValue \ &H10
End Function

Private Function SHR6(ByVal bytValue As Byte) As Byte
    SHR6 = bytValue \ &H40

End Function


У меня где-то еще quoted-printable завалялась

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 15.03.2006 (Ср) 0:35

Хм.. Интересный вопрос.. Я с ним сталкивался пару месяцев назад, когда архиватор писал..
Для этого нужен спец.алгоритм. Я делал что то типа этого:
Код: Выделить всё
'допустим, что в s - наш текст.
b_ok = 0
For i=0 to 255 'по кодировке ASCII.
For j=1 to  i_max 'i_max - мыслимый предел, до которого есть смысл просчитывать..
  s_buf=String(j, chr$(i))
  if Instr(1, s, s_buf) = 0 then
   b_ok = 1
   exit for
  end if
Next
Next
if b_ok = 0 then
msgbox "это бессмысленно... файл получится очень большим"
exit sub
end if


Ну что-то типа этого.. За ошибки не пинать +_+


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

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

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

    TopList