PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Переменную типа Long "разобрать" на Byte


Переменную типа Long "разобрать" на Byte

Сообщений 1 страница 30 из 48

1

Здравствуйте.
Осваиваю  PureBasic и возникла необходимость разбирать переменную из 4 байт по байтно в 4 байта и далее с ними индивидуально работать.
В бейсике для AVR это делается с использованием оверлей что очень удобно. А тут такого не нашел. :dontknow: 
Думал забрать побитно по 8 бит но и тут пока запутался.
Язык три дня как изучаю. В инете искал и не нашел инфо кроме ссылки на форум purebasic.info который уже не доступен.
Как сложить побайтно в лонг я понимаю- преобразовать байты в стринги, сложить их в нужном порядке в строке и далее Val  в лонг для дальнейших вычислений.

0

2

Здравствуйте.
Есть функции по работе с памятью, воспользуйтесь ими. Что бы разбить по байтам, подойдёт функция PeekA

Syntax

Value.a = PeekA(*MemoryBuffer)
Description

For advanced programmers. PeekA() reads an ascii character (1 byte) from the specified memory address.

0

3

Код:
; Из последней русифицированной справки
; Пример: Применение преобразования типов для объединения и разделения многокомпонентных значений.
Structure RGBA   ;  Создаём шаблон Структуры RGBA (тип RGBA, назовите тип как Вам удобно),
  StructureUnion ;  и вкладываем в него Структурное Объединение,
    color.l      ;  в котором объединяем переменную 'color' с типом Long (4 байта),
    byte.a[4]    ;  и статический массив с типом ASCII (1 байт), элементы массива накладываются на байты переменной 'color'.
  EndStructureUnion
EndStructure

col.RGBA  ; Создаём экземпляр структуры RGBA, в виде переменной col с типом RGBA.

col\color = RGBA(255, 200, 150, 100)  ; Присваиваем полю 'color' значение RGBA. 
Debug "Красный:   " + col\byte[0]     ; Считываем значение из нужного элемента массива (он же байт переменной 'color').
Debug "Зелёный:   " + col\byte[1]     ; Так можно объединять и разделять много-компонентные значения на составляющие.
Debug "Синий:     " + col\byte[2]     ; В данном случае получилось разделение, но если записать компонентные значения по  
Debug "Прозрачность:  " + col\byte[3] ; элементам массива, то значение считанное из col\color - будет полным значением RGBA.
End

0

4

Еще вариант со сдвигами.

Код:
l.l = 12345678
Debug "1 байт "+Str(l & 255)
Debug "2 байт "+Str((l>>8) & 255)
Debug "3 байт "+Str((l>>16) & 255)
Debug "4 байт "+Str((l>>24) & 255)

0

5

Спасибо за помощь.
Вариант который предложил Пётр то что надо и самый простой.

0

6

ethelberg написал(а):

Спасибо за помощь.
Вариант который предложил Пётр то что надо и самый простой.

Да что ж народ так структур пугается? Для процессора как раз простой мой! )))

Union для таких вещей придуман лет 40 назад наверно.

p.s. хотя во что там именно Фред в асм. коде оба варианта разворачивает нужно ещё по смотреть.

Отредактировано useful (26.09.2020 17:21:32)

0

7

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

0

8

Можно еще использовать способ предложенный во втором сообщении. Он тоже не сложный.

Код:
l.l = 12345678
Debug "1 байт "+PeekA(@l)
Debug "2 байт "+PeekA(@l+1)
Debug "3 байт "+PeekA(@l+2)
Debug "4 байт "+PeekA(@l+3)

0

9

Спасибо за очередной пример.
Справка довольно куцая. Есть команда а как ней пользоваться на простом примере не расписано.
Потому возникают затруднения если с ней первый раз работать.

0

10

Если вдруг не в курсе существования, то вот https://www.cyberforum.ru/pure-basic/th … st14610676

+1

11

Объединив все примеры, можно вывести следующую формулу для Long

Код:
l.l = 12345678
Debug  "1 байт "+Red(l)
Debug  "2 байт "+ Green(l)
Debug  "3 байт "+ Blue(l)
Debug  "4 байт "+ Alpha(l)

Главное не забыть последовательность RGBA  :)

0

12

На самом деле варианты не много различаются. Один позволяет разобрать на байты в строчном а другой с десятичном формате.
И в зависимости от задачи  по дальнейшей обработке байтов выбирать нужный вариант.

0

13

Господа! Вы чего задачу из основы основ оснований программирования превращаете в шоу несуразностей?

0

14

И в чём выражается эта несуразность? Нормально общаемся, для кого то простые и очевидные вещи а для меня наоборот.
Я вот два дня бьюсь с записью в файл в формате хекс полученных байт и пока точно что одна несуразность выходит.
С одним разобрался, на следующем споткнулся. Это нормально.  Не разберусь сам- спрошу. Это же не запрещено?
Честно не подозревал что будет так сложно для меня после написания программ для AVR на бейсике и ассемблере.
Такой этап что туго оно "лезет" в меня. Потом попустит.

0

15

ethelberg написал(а):

...Не разберусь сам- спрошу. Это же не запрещено?

Я не вправе кому то что то запрещать и это было точно не в ваш адрес.

Ваш вопрос был: разбирать переменную из 4 байт по байтно в 4 байта

То, что я называю основами: зная адрес переменной получить четыре адреса составных частей один из которых естественно имеет нулевое смещение, т.е. совпадает с адресом переменной.
Есть несколько способов в прямую решающих именно эту задачу. После решения которой естественным образом решаются любые другие.
Для решения первоначальной задачи вызов каких то функций или 4 и более команды для получения четырёх частей я и называю несуразностью.

ИМХО - аксиома

Код:
EnableExplicit
Structure L_BYTE
  StructureUnion
    MainVar.l
    PartVar.a[4]
  EndStructureUnion
EndStructure

Define TestVar.L_BYTE
Dim HexStr.s(255)
Define i.i
; Это выполняенся 1раз и лучше вообще заранее и результат в датасекцию
For i = 0 To 255
HexStr(i) = RSet(Hex(i), 2, "0")  
Next
;
TestVar\MainVar = -1 
Debug TestVar\PartVar[0]
Debug HexStr(TestVar\PartVar[0])
Debug TestVar\PartVar[1]
Debug HexStr(TestVar\PartVar[1])
Debug TestVar\PartVar[2]
Debug HexStr(TestVar\PartVar[2])
Debug TestVar\PartVar[3]
Debug HexStr(TestVar\PartVar[3])
Debug "----------------------"
TestVar\MainVar = 0 
Debug TestVar\PartVar[0]
Debug HexStr(TestVar\PartVar[0])
Debug TestVar\PartVar[1]
Debug HexStr(TestVar\PartVar[1])
Debug TestVar\PartVar[2]
Debug HexStr(TestVar\PartVar[2])
Debug TestVar\PartVar[3]
Debug HexStr(TestVar\PartVar[3])
Debug "----------------------"
TestVar\MainVar = Random(2147483647) 
Debug TestVar\PartVar[0]
Debug HexStr(TestVar\PartVar[0])
Debug TestVar\PartVar[1]
Debug HexStr(TestVar\PartVar[1])
Debug TestVar\PartVar[2]
Debug HexStr(TestVar\PartVar[2])
Debug TestVar\PartVar[3]
Debug HexStr(TestVar\PartVar[3])
; Т.е. не каких вызовов функций и прочих манипуляций
; Если подготовиться, то огромное количество алгоритмов это просто взятее заготовленного по адресу.
; При этом индекс массива это тот же адрес (смещение от адреса начального)
End

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

Отредактировано useful (30.09.2020 05:52:45)

0

16

ethelberg написал(а):

файл в формате хекс

Один из возможных вариантов кода.

Код:
Structure ArrA
  a.a[0]
EndStructure

Procedure.s Hex_String(Adr.u, Type.a, *Point.ArrA, Size.a)
  Protected s.s=":"+RSet(Hex(Size, #PB_Ascii), 2, "0")
  Protected i, Summ.a=0
  
  s+RSet(Hex(Adr, #PB_Unicode), 4, "0")
  s+RSet(Hex(Type, #PB_Ascii), 2, "0")
  
  Summ + Size + (Adr & $FF) + ((Adr>>8) & $FF) + Type
  
  If *Point And Size>0
    Size-1
    For i=0 To Size
      Summ + *Point\a[i]
      s+RSet(Hex(*Point\a[i], #PB_Ascii), 2, "0")
    Next i
  EndIf
  
  Summ = 0 - Summ
  s+RSet(Hex(Summ, #PB_Ascii), 2, "0")
  
  ProcedureReturn s
EndProcedure

Procedure SaveHexFile(FileName.s, *Point.ArrA, Size, StartAdr.l) ; Сохранение в hex файл.
  Protected Res = #False, Adr.l=0, i, Count=0, FileID
  
  If FileName<>"" And *Point And Size>0 And StartAdr>=0
    
    If FileSize(FileName)>0
      DeleteFile(FileName)
    EndIf
    
    FileID = CreateFile(#PB_Any, FileName, #PB_Ascii)
    If FileID
      
      Adr = (((StartAdr/$FFFF)&$FF00)>>8) | (((StartAdr/$FFFF)&$FF)<<8)
      WriteStringN(FileID, Hex_String(0, 4, @Adr, 2))
      
      Adr = StartAdr & $FFFF
      
      Size - 1
      For i=0 To Size Step 16
        
        If Adr>$FFFF ; Новый сегмент.
          StartAdr+$FFFF
          Adr = (((StartAdr/$FFFF)&$FF00)>>8) | (((StartAdr/$FFFF)&$FF)<<8)
          WriteStringN(FileID, Hex_String(0, 4, @Adr, 2))
          Adr=0
        EndIf
        
        If Size - i>=16
          Count = 16
        Else
          Count = Size - i + 1
        EndIf
        
        WriteStringN(FileID, Hex_String(Adr, 0, *Point+i, Count))
        
        Adr+16
      Next i
      
      WriteStringN(FileID, ":00000001FF") ; Строка обозначающая конец файла.
      CloseFile(FileID)
      Res = #True
    EndIf
  EndIf
  
  ProcedureReturn Res
EndProcedure


Dim Buff.a(10) ; Буфер под данные.

For i=0 To 9
  Buff(i) = i
Next

If SaveHexFile("D:\Text.hex", @Buff(), ArraySize(Buff()), 0)
  Debug "Файл создан"
Else
  Debug "Ошибка при создании файла"
EndIf

0

17

А зачем такие портянки кода? По простому то записать нельзя что ли:

Код:
l.l = 12345678
If CreateFile(0,"c:\test.txt")
  For i = 0 To 3
    WriteStringN(0,RSet(Hex(PeekA(@l+i),#PB_Byte),2,"0"))
  Next 
CloseFile(0)
EndIf

0

18

ВиниПур написал(а):

По простому то записать нельзя

Нельзя. https://ru.wikipedia.org/wiki/Intel_HEX
В файле кроме данных, адреса, тип записи, контрольная сумма и т. д.

Для примера hex файл с прошивкой для микроконтроллера.

Код:
:020000040800F2
:100000000050002009000008074B10229A61A3F558
:1000100080334FF440125A60DA6882F40052DA609A
:10002000024A013AFDD1F7E70010024040420F00BA
:0400000508000000EF
:00000001FF

0

19

Пётр написал(а):

В файле кроме данных, адреса, тип записи, контрольная сумма и т. д.

Тогда понятно.
Я подумал, что речь шла о том, как "разбирать переменную из 4 байт по байтно в 4 байта и далее" записать эти байты в виде HEX в обычный текстовый файл
Собственно,  я даже не подозревал, что существует специальный "файл в формате хекс".  8-)

0

20

Пётр написал(а):

l.l = 12345678 Debug "1 байт "+PeekA(@l) Debug "2 байт "+PeekA(@l+1) Debug "3 байт "+PeekA(@l+2) Debug "4 байт "+PeekA(@l+3)

http://i.prntscr.com/LroUH4asS6Ox6FF3J7GzWw.png

0

21

Я не пойму самого главного
вот код в котором два простейших варианта
мой с адресацией через union
и с помощью функций, думаю(ИМХО) [peekA адрес + смещение] самый эффективный

Код:
EnableExplicit
Structure L_BYTE
  StructureUnion
    MainVar.l
    PartVar.a[4]
  EndStructureUnion
EndStructure
Define L4B.L_BYTE
Define L4.l
Define B0.a
Define B1.a
Define B2.a
Define B3.a
;------------------
L4B\MainVar = -1 
B0 = L4B\PartVar[0]
B1 = L4B\PartVar[1]
B2 = L4B\PartVar[2]
B3 = L4B\PartVar[3]
;------------------
L4 = -1
B0 = PeekA(@L4+0)
B1 = PeekA(@L4+1)
B2 = PeekA(@L4+2)
B3 = PeekA(@L4+3)
;------------------
End

Решил я перепроверить то, в чём и так был уверен
Для 5.72 x64 asm

Код:
; L4B\MainVar = -1 
  LEA    rbp,[v_L4B]
  MOV    dword [rbp],-1
; B0 = L4B\PartVar[0]
  MOVZX  rax,byte [rbp]
  MOV    byte [v_B0],al
; B1 = L4B\PartVar[1]
  MOVZX  rax,byte [rbp+1]
  MOV    byte [v_B1],al
; B2 = L4B\PartVar[2]
  MOVZX  rax,byte [rbp+2]
  MOV    byte [v_B2],al
; B3 = L4B\PartVar[3]
  MOVZX  rax,byte [rbp+3]
  MOV    byte [v_B3],al
; 
; L4 = -1
  MOV    dword [v_L4],-1
; B0 = PeekA(@L4+0)
  LEA    rax,[v_L4]
  MOV    r15,rax
  MOV    rax,r15
  MOV    rcx,rax
  CALL   PB_PeekA
  MOV    byte [v_B0],al
; B1 = PeekA(@L4+1)
  LEA    rax,[v_L4]
  INC    rax
  MOV    rcx,rax
  CALL   PB_PeekA
  MOV    byte [v_B1],al
; B2 = PeekA(@L4+2)
  LEA    rax,[v_L4]
  ADD    rax,2
  MOV    rcx,rax
  CALL   PB_PeekA
  MOV    byte [v_B2],al
; B3 = PeekA(@L4+3)
  LEA    rax,[v_L4]
  ADD    rax,3
  MOV    rcx,rax
  CALL   PB_PeekA
  MOV    byte [v_B3],al
; 

Какие ещё могут быть аргументы по поводу {много кода}/{мало кода} не понимаю.
Четыре раза выполнить две команды
; B0 = L4B\PartVar[0]
  MOVZX  rax,byte [rbp]
  MOV    byte [v_B0],al
Или четыре раза, а некоторые предлагали и больше
подготовить параметры, вызвать функцию, которая в себе сохранит контекст подготовит возврат восстановит контекст и так "бутербродно"

Именно это я и назвал НЕСУРАЗНОСТЬЮ!
p.s. И это хорошая иллюстрация того, что в PB какого то особого оптимизатора отродясь не бывало. Т.е. если мы пишем в коде вызов функции со всеми накладными расходами естественными для этого, то это именно вызов и будет, упрощать код за нас не предусмотрено.

Отредактировано useful (01.10.2020 12:22:50)

0

22

Привет всем.
Извините что сразу не смог ответить. Были обстоятельства не преодолимой силы.

useful написал(а):

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

Файл eep  для записи в микроконтроллер.

Код:
Global Dim Byte.c(12)
Global Dim long.l(2)       ;4 байта
Global.a temp              ;байт для счёта
Global Summa.c             ;2 байта 
Global Dim ByteStr.s{2}(12)
Global TempString.s
;разбор на байты
long(0) = 12                       ;любое число для проверки в границах лонг
Byte(0)=PeekA(@long(0))    ;младший байт
Byte(1)=PeekA(@long(0)+1)
Byte(2)=PeekA(@long(0)+2)
Byte(3)=PeekA(@long(0)+3)  ;старший байт

long(1)=876543210 
Byte(4)=PeekA(@long(1))    ;младший байт
Byte(5)=PeekA(@long(1)+1)
Byte(6)=PeekA(@long(1)+2)
Byte(7)=PeekA(@long(1)+3)  ;старший байт

long(2) =234554321
Byte(8)=PeekA(@long(2))    ;младший байт
Byte(9)=PeekA(@long(2)+1)
Byte(10)=PeekA(@long(2)+2)
Byte(11)=PeekA(@long(2)+3) ;старший байт  

;Расчёт контрольной суммы
Summa=0
For temp=0 To 11 
 Summa= Summa+Byte(temp)   ;INC 
Next
Summa=0-Summa              ;контрольная сумма ноль минус сумма всех байт
;Debug "suuma="+Summa    
Byte(12)=PeekA(@Summa)     ;младший байт

;файл
TempString$ = ":20000000"
;TempString = ""
For temp=0 To 12           ;12байт = 3 четырёхбайтных числа + 1байт контрольная сумма
 TempString$ + RSet(Hex(byte(temp)),2,"0") ;ноль в начале если меньше F в hex
Next 
  
Debug "HEX " + TempString$

If CreateFile(0,"test.txt")
  WriteString(0, TempString$, #PB_Ascii)
  CloseFile(0)
EndIf 

Это то на чём остановился неделю назад.
На байты разобралось, в дебаг выводит то что мне нужно но в файл пишется пока в не верном формате. Каждый символ это байт. 0С вижу редакторе WinHex как 43 30 по таблице символов. Буду разбираться с примерами. Спасибо парни Вам за них.

0

23

eep файл имеет бинарный формат, а не текстовый.
То есть запись в него

Код:
If CreateFile(0,"test.eep")
  WriteData(0, @Byte(), ArraSize(Byte()))
  CloseFile(0)
EndIf 

0

24

Осмелюсь предположить, что автор имел ввиду всё же не ЕЕР файл, а НЕХ.
Если так, то мой вариант такой:

Код:
#file_test=0
Dim long.l (1,3); массив с данными, которые нужно записать в HEX файл
long(0, 0)=12  
long(0, 1)=876543210 
long(0, 2)=234554321
long(0, 3)=-234554321

long(1, 0)=201032
long(1, 1)=111111111 
long(1, 2)=-324354645
long(1, 3)=-999999996

Summa.a=0; переменная в один байт для вычисления КС в конце каждой строки
data_end$=":00000001FF"; строка, означающая конец HEX файла
TempString$=""; переменная для хранения строки результата для HEX файла

nb_bytes_line$=RSet(Hex((ArraySize (long(), 2)+1)*4), 2, "0"); количество байт в каждой строке равно размеру массива данных второго уровня
start_address=0; стартовый адрес (в десятиричном исчислении)
type_write$="00"; тип строки - 00 это данные

For f=0 To ArraySize (long(), 1); цикл по количеству строк
  TempString$+":"+nb_bytes_line$+RSet(Hex(start_address), 4, "0")+type_write$; начинаем собирать строку. Добавляем кол-во байт данных в строке, адрес для микроконтроллера, в который нужно вписать данные и тип записи в строке
  For i=0 To ArraySize (long(), 2); цикл по количеству байт в строке, у нас 16
    For i_1=0 To 3; цикл по кол-ву байт в переменной Long, 4 байта
      Summa-PeekA (@long(f, i)+i_1); вычисляем КС
      TempString$+RSet(Hex(PeekA (@long(f, i)+i_1)), 2, "0"); прибавляем байт данных к переменной общей строки
    Next
  Next
  TempString$+RSet(Hex(Summa), 2, "0")+#CRLF$; добавляем КС и переход на новую строку и возврат коретки
  Summa=0; сбрасываем переменную для расчёта КС
  start_address+((ArraySize (long(), 2)+1)*4); увеличиваем адрес 
Next

TempString$+data_end$; добавляем к общей переменной конец файла HEX
If CreateFile(#file_test,"res_test.txt"); сохраняем общую переменную в текстовый файл
  WriteString(#file_test, TempString$, #PB_Ascii)
  CloseFile(#file_test)
Else
  Debug "Can not create file!"; или не сохраняем)))
EndIf 

Не уверен, что всё правильно, нужно проверять, мне уже некогда.

0

25

Без комментов код выглядит менее массивным:

Код:
#file_test=0
Dim long.l (1,3)
long(0, 0)=12  
long(0, 1)=876543210 
long(0, 2)=234554321
long(0, 3)=-234554321
long(1, 0)=201032
long(1, 1)=111111111 
long(1, 2)=-324354645
long(1, 3)=-9999994
Summa.a=0
data_end$=":00000001FF"
TempString$=""
nb_bytes_line$=RSet(Hex((ArraySize (long(), 2)+1)*4), 2, "0")
start_address=0
type_write$="00"
For f=0 To ArraySize (long(), 1)
  TempString$+":"+nb_bytes_line$+RSet(Hex(start_address), 4, "0")+type_write$
  For i=0 To ArraySize (long(), 2)
    For i_1=0 To 3
      Summa-PeekA (@long(f, i)+i_1)
      TempString$+RSet(Hex(PeekA (@long(f, i)+i_1)), 2, "0")
    Next
  Next
  TempString$+RSet(Hex(Summa), 2, "0")+#CRLF$
  Summa=0
  start_address+((ArraySize (long(), 2)+1)*4)
Next
TempString$+data_end$
If CreateFile(#file_test,"res_test.txt")
  WriteString(#file_test, TempString$, #PB_Ascii)
  CloseFile(#file_test)
Else
  Debug "Can not create file!"
EndIf 

0

26

Timon написал(а):

Осмелюсь предположить, что автор имел ввиду всё же не ЕЕР файл, а НЕХ.

Файл еер такой же формат. Суть в чём. Я сделал хорошему другу на ATTINY2313 управление тремя задвижками в цех. Но нужно по месту  "конфигурировать". Делать сложнее контроллер с кнопками и дисплеем не имеет смысла для простой задачи.
AVR студию там ставить или БаскомAVR и объяснять что и где править в исходнике -бесполезно, ибо такое помнят ровно до закрытия программы. Вот у меня и возникла идея выдать ему программатор USBASP с панелькой дип20 + простая программка где тупо числа вносятся в окошко, создаётся фалик.eep для записи и AVRDUDE зашивается в тиньку в эпром. А дальше хоть трава не расти.
Самое удивительное что динозавр понипрог игнорирует многое включая контрольную сумму! Этот пишет правильно с текстового файла. Но он в виду своей древности не знает программаторы работающие по USB.(( А AVRDUDE подавай всё по честному.
Вот я и изучаю PureBasic. Это интересно. Человек пока что то изучает и развивается- он живёт.

Я ни когда ранее что там и как писать в  файл еер особо не зарывался. Знаю что младший байт идёт первым. По арабски.)))
Компилятором всегда еер генерировал когда он мне был нужен.

0

27

ethelberg
Пока всё что вы пишите выглядит как то так:
Я понятия не имею, что мне нужно, там что то про байты и расширение файла .eep

Если помощь нужна с eep это вероятно отдельная тема про формат, спецификацию, ссылки на те места в сети где это описано под ваш конкретный случай.
Если помощь нужна с purebasic, то всё таки проблему желательно сформулировать конкретно. А то всё выглядит странно и точно не идёт к решению задачи ибо она не сформулирована, только тема обозначена.

ИМХО

p.s. вот например в этой ветке выяснилось, что речь про hex. Т.е. человека просят показать свой eep о котором он спрашивает, а он публикует hex.
_https://forum.cxem.net/index.php?/topic/204637-как-читать-eeprom-на-компе-файлик-eep/_

p.p.s. Не пойму, что на этом форуме с публикацией ссылок. Убрать _ в начале и в конце

Отредактировано useful (06.10.2020 06:17:45)

0

28

Да, автор темы запутал с форматом... Так в каком виде должны сохранены в файл для авр-дудки? В INTEL HEX, т.е. в текстовом представлении. С указанием адреса и контрольной суммы для каждой строки. Верно?
Тогда тогда при чём тут eep? Конечно, это только расширение файла, на самом деле ни на что не влияет, кроме ассоциации. Но так уж принято, что если человек говорит про eep формат файла, значит подразумевается, что это чисто бинарный файл, без указания адресов, без контрольной суммы и т.п. Чисто байт за байтом последовательно.

Знаю что младший байт идёт первым. По арабски.)))

И арабов сюда приплёл  :D Сам запутался и других путаешь. Когда младший байт впереди, это называется little endian. Принято в архитектурах x86 (и не только, конечно). А арабский как раз наоборот, когда старший байт впереди. Это называется big endian, так же как и биты в байте расположены. С этой точки зрения этот порядок правильный.
ethelberg, обрати внимание на мой пример. Должно работать так как надо, если я всё же тебя верно понимаю.

0

29

useful написал(а):

Я понятия не имею, что мне нужно, там что то про байты и расширение файла .eep

Ни чего подобного! Я скачал еер с тиньки и посмотрел как выглядит скачанный файл. И делал подобно чтоб получилось на выходе. Формат файла я изучил. Он тут хорошо описан

Так как с пуребейсиком имею дело первый раз то поступал так же как это делал для AVR- разбор на байты и потом сбор в нужной мне последовательности. То есть младший байт идёт первым. В конце расчёт контрольной суммы. С этим я разобрался и так же портировал с AVR часть расчётов. Попутно разобрался с округлением дробных чисел. Тут ведь можно по разному округлять. Например с помощью #PB_Round_Down и т.д.  На AVR всегда в низ округлялось Long=Float
Стопорнулся с записью в файл в нужном формате. Куча команд новых для меня.

Timon написал(а):

ethelberg, обрати внимание на мой пример. Должно работать так как надо, если я всё же тебя верно понимаю.

Спасибо. Вижу что правильно. B в хекс редакторе нормально. Проверить просто- нужно записать в тиньку и обратно считать. Вечером  проверю с ардуинкой. Результат напишу вам.

PS: мне надо всего 12 байт записывать. По этому я упростил в расчётах вычисление адресов и прочее подставляя их фиксировано. Чисто 12 байт+контрольная сумма. Зачем записывать в память и потом  файл я только изучаю. Мне думалось что строку можно просто записать в файл. Ну бывает(((

0

30

ethelberg написал(а):

Он тут хорошо описан

Там описание hex файла, а не eep.
Как я уже писал, eep имеет двоичный формат. Это легко проверить.
При компиляции этого кода

Код:
$eeprom
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8

получаем eep файл с таким содержимым.
http://a.radikal.ru/a10/2010/03/c21631a8c9f2.png

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Переменную типа Long "разобрать" на Byte