powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование типов
29 сообщений из 29, показаны все 2 страниц
Преобразование типов
    #35197266
Anton_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть массив
Dim x(0 To 3) As Byte

Есть переменная integer
Dim xx As Integer

при выполнении
xx = CInt(x) - получаем ошибку
Error 1 Value of type '1-dimensional array of Byte' cannot be converted to 'Integer'.
Form1.vb

ПОЧЕМУ?????
...
Рейтинг: 0 / 0
Преобразование типов
    #35197296
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты массив байт пытаешься преобразовать в одну переменную integer, поэтому и ошибка.
нужно преобразовывать конкретный элемент массива.

Код: plaintext
xx=CInt(x( 0 ))
...
Рейтинг: 0 / 0
Преобразование типов
    #35197337
Anton_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как тогда получить из этих четырех элементов массива получить одно число типа integer
желательно пример в одну строчку
...
Рейтинг: 0 / 0
Преобразование типов
    #35197371
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_85,
а ты сам как представляешь правила перевода массива из четырёх байтовых элементов в двухбайтное целое?
...
Рейтинг: 0 / 0
Преобразование типов
    #35197388
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Anton_85
> а как тогда получить из этих четырех элементов массива получить одно
> число типа integer
> желательно пример в одну строчку
разберёшся?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Преобразование типов
    #35197487
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Option Explicit

Type tByte4
    b( 0  To  3 ) As Byte
End Type
Type tLong
    x As Long
End Type

Public Sub Main()
    Dim t As tLong, b As tByte4
    
    b.b( 0 ) =  0 
    b.b( 1 ) =  4 
    
    LSet t = b

    Debug.Print t.x
End Sub
...
Рейтинг: 0 / 0
Преобразование типов
    #35197501
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если на выходе надо иметь именно Integer (точнее их будет 2-а, ведь 4-ре байта), то:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit

Type tByte4
    b( 0  To  3 ) As Byte
End Type
Type tLong
    x As Integer
    y As Integer
End Type

Public Sub Main()
    Dim t As tLong, b As tByte4
    
    b.b( 0 ) =  0 
    b.b( 1 ) =  4 
    
    LSet t = b

    Debug.Print t.x, t.y
End Sub
...
Рейтинг: 0 / 0
Преобразование типов
    #35198216
Anton_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как мне его загнать в этот код???

Public Class Form1
Dim x(0 To 3) As Byte
Dim z As String
Dim xx As Integer
Dim myob As Object
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim b As FileStream = New FileStream("c:\1.bmp", FileMode.Open)
b.Position = 2
b.Read(x, 0, 4)
xx = CInt(x(0))
myob = x
' x(0) = 1
'x(1) = 1
'x(2) = 1
'x(3) = 2
z = CStr(x(0))
Dim q As Integer = CInt(x(0))

MsgBox(CStr(CInt(x(0))))

b.Close()
End Sub
End Class
...
Рейтинг: 0 / 0
Преобразование типов
    #35198449
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_85,
Если ваш код из .NET, то милости просим в .NET форум. Здесь VB6, VBA, VBS
...
Рейтинг: 0 / 0
Преобразование типов
    #35200847
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдераю из рабочего кода.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
dim fbyte( 0  to  3 ) As Byte
dim c as long
dim t as long
dim o as long
dim e as long
 
t =  0 
For E =  3  To  0  Step - 1 
c =  256  ^ E
t = t + c * fbyte(E)
Next E
o = t
MsgBox o

Число записано 4 байтами, а я его перевожу в длинное целое.
Байты от меньшего к большему.

Есть и обратная процедура.
...
Рейтинг: 0 / 0
Преобразование типов
    #35200994
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извращенцы вы все...
Код: plaintext
1.
2.
dim fbyte( 0  to  3 ) As Byte
dim c as long
CopyMemory с, fbyte( 0 ),  4 
...
Рейтинг: 0 / 0
Преобразование типов
    #35201023
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyИзвращенцы вы все...
Код: plaintext
1.
2.
dim fbyte( 0  to  3 ) As Byte
dim c as long
CopyMemory с, fbyte( 0 ),  4 


Ну а что делать, тем, кто не является, счастливым обладателем понятного справочника? Остаётся извращатся!

Я так понял, что CopyMemory
берёт x байт, в третьем аргументе, начиная с адреса второго, и всё это помещает в первый?
CopyMemory [результат], [что], [сколько]

А как проделать обратное преобразование? Т.е. из длинного целого записать эти 4 байта?
...
Рейтинг: 0 / 0
Преобразование типов
    #35201153
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-SНу а что делать, тем, кто не является, счастливым обладателем понятного справочника?Не забывать, что они являются счастливыми обладателями интернета, посредством которого доступен понятный справочник msdn.microsoft.com )))
Eric-SА как проделать обратное преобразование?Мог бы уже догадаться))
Код: plaintext
CopyMemory fbyte( 0 ), с,  4 
...
Рейтинг: 0 / 0
Преобразование типов
    #35201208
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msdn там всё самое интересное на английском.
В прочем у меня есть локальная версия, так же не русифицированная.

А я вот тут, подумал, ведь long, ну и другие переменные немного не в той форме значение хранят.
Т.е. значение-то будет сохранено и востановлено, только вот, формат его записи будет другой.
А ещё целый бит тратится на знак "-" (минус)!
...
Рейтинг: 0 / 0
Преобразование типов
    #35201261
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вот тут, подумал, ведь long, ну и другие переменные немного не в той форме значение хранят.
Т.е. значение-то будет сохранено и востановлено, только вот, формат его записи будет другой.В смысле старший-младший байты? Возможно. Зависит от смысла преобразования и использования массива.
А ещё целый бит тратится на знак "-" (минус)!Нет, знак получается из формата записи. -1 = FF FF FF FF, -2 = FE FF FF FF, -3 = FD FF FF FF и т.д.
...
Рейтинг: 0 / 0
Преобразование типов
    #35201592
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-SВыдераю из рабочего кода.Это нерабочий код. Не учтён случай старшего байта, большего 127.
...
Рейтинг: 0 / 0
Преобразование типов
    #35201597
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-SА ещё целый бит тратится на знак "-" (минус)!Неправда. "Родным" для 80x86 архитектуры является представление 32-битных целых в дополнительном коде.
...
Рейтинг: 0 / 0
Преобразование типов
    #35201642
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт Eric-SА ещё целый бит тратится на знак "-" (минус)!Неправда. "Родным" для 80x86 архитектуры является представление 32-битных целых в дополнительном коде.

Но мы то говорим о бэйсиковских integer и long!

Про рабочий код... Там это в другом месте проверяется. Здесь вообще число не может быть очень большим. Обычно два старших байта вообще в ноль. Это не универсальная функция, а именно конкретный случай.
Кому понадобится писать имя файла размером 4 gb?
...
Рейтинг: 0 / 0
Преобразование типов
    #35201787
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-SНо мы то говорим о бэйсиковских integer и long!Угу. Напрямую использующих соответствующие машинные типы. Что должен выдать код
Код: plaintext
1.
2.
Dim i As Integer, l As Long
i = &H8000: l = &HFFFFFFFF
Debug.Print i, l
? Почему? Почему выдаёт, что выдаёт?
Eric-SПро рабочий код... Там это в другом месте проверяется. Здесь вообще число не может быть очень большим. Обычно два старших байта вообще в ноль. Это не универсальная функция, а именно конкретный случай.Было бы это указано - ни слова бы не сказал.
Eric-SКому понадобится писать имя файла размером 4 gb?Откуда взялось имя файла?
...
Рейтинг: 0 / 0
Преобразование типов
    #35201835
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно с типами данных и способами их хранения, могу и ошибатся.
[quote]
are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767. The...
[/quote]
Здесь я вижу отрицательное число. Дальше, в 16 битах у нас 2^16 возможных значений. Т.е. 65536, отсюда пришел к выводу, что один байт означает отрицательное число.

На сколько я помню, в машине об отрицательных числах реч вообще не идёт. Там отдельный флаг процессора.


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

На асме это бы выглядело бы ещё веселее, но мне и этот вариант подходит. Там же по сути просто dword грузится в 32 битный регистр, и это уже не 4 соседних байта, а длинное целое число.


С 4 гиговым именем файла, немного преувеличил. На самом деле моя процедура работает с размерами текстовых документов. А многие редакторы хоть и хвалятся способностью прожевать 2 гиговый текстовик, но делают это очень долго и в принципе это никому не нужно.
...
Рейтинг: 0 / 0
Преобразование типов
    #35201864
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задаю вопрос, который так же подпадает под заголовок данный темы.

Пожалуйста приведите пример преобразования битового массива в строку и обратно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dim b() as byte
dim s as string
s = "привет, люди!"

redim b( 1  to len(s))

' на этой строке ошибка
b = ascb(s)

' на этой тоже
s = chrb$(b)

Пока извратился и написал свой перевод, но он естественно работает медленнее. И copyMem здесь не подайдёт, поскольку s, кажется, в уникоде. Кстати эта же функция в какой-то dll'ке?
...
Рейтинг: 0 / 0
Преобразование типов
    #35202604
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StrConv или опять же CopyMemory.
...
Рейтинг: 0 / 0
Преобразование типов
    #35202610
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или просто b = s =)
...
Рейтинг: 0 / 0
Преобразование типов
    #35203896
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-SЛадно с типами данных и способами их хранения, могу и ошибатся.

are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767. The...

Здесь я вижу отрицательное число. Дальше, в 16 битах у нас 2^16 возможных значений. Т.е. 65536, отсюда пришел к выводу, что один байт означает отрицательное число.

На сколько я помню, в машине об отрицательных числах реч вообще не идёт. Там отдельный флаг процессора."В огороде бузина, в Киеве дядька." IA-32 Intel(R) Architecture Software Developer's Manual. Volume 1: Basic Architecture4 Data Types
...
4.2.1. Integers
The IA-32 architecture defines two typed of integers: unsigned and signed. Unsigned integers are ordinary binary values ranging from 0 to the maximum positive number that can be encoded in the selected operand size. Signed integers are two’s complement binary values that can be used to represent both positive and negative integer values.
Some integer instructions (such as the ADD, SUB, PADDB, and PSUBB instructions) operate on either unsigned or signed integer operands. Other integer instructions (such as IMUL, MUL, IDIV, DIV, FIADD, and FISUB) operate on only one integer type.
The following sections describe the encodings and ranges of the two types of integers.
4.2.1.1. UNSIGNED INTEGERS
...
4.2.1.2. SIGNED INTEGERS
...
...
Рейтинг: 0 / 0
Преобразование типов
    #35204198
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт
"В огороде бузина, в Киеве дядька."

Именно. Я цитировал msdn, про vb6, а вы архитектуру 32 разрядного проца. Как я уже писал типы разные, хоть названия и одинаковые.
CopyMem будет копировать именно бэйсиковский формат никуда его не преобразуя.
На то я и писал функцию, чтобы привести данные из одного формата в другой.

Если кто работал с FreeBasic, поймёт всю нелепость сложившейся ситуации, поскольку в нём этих типов данных ещё больше.
Например В нём есть integer и uinteger, первая стандартная бэйсиковская, а вторая именно стандартная машинная, т.е. положительное целое.
...
Рейтинг: 0 / 0
Преобразование типов
    #35204463
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eric-S,
Да, дискуссия себя изжила.
...
Рейтинг: 0 / 0
Преобразование типов
    #35204472
NisanScanLiner01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
преобразуйте тип вот от сюда !!!
...
Рейтинг: 0 / 0
Преобразование типов
    #35307257
Dick Johnson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как я понял в бейсике нет более длинного целого типа чем long ?
задача такова, что нужно автоматически заполнить в таблице список с номерами бланков идущие по прорядку. Номер бланка - любые 10 цифр. И значений из диапазона -2,147,483,648 to 2,147,483,647 не хватает, что бы преобразовать к числу и можно было бы запускать цикл.
Использую Currency, вроде работает, но меня смущает что Currency все-таки не целый тип и как будет работать For
...
Рейтинг: 0 / 0
Преобразование типов
    #35307610
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dick Johnsonменя смущает что Currency все-таки не целый тип и как будет работать ForХоть и не целый, но из точных .

Для For (и не только для него) можно использовать, например,
Код: plaintext
... = 1@ To 12@ Step = 1@
, чтобы не ждать милостей от Васика, - "ибудит тибе щасте".
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]