Page 1 of 1
Strange issue with IF and Peek
Posted: Fri Jun 27, 2025 7:30 pm
by dibor
Hello gung.
I broke my head with this problem and I can't understand where I did wrong.
Code: Select all
*Buffer = AllocateMemory(2048)
If CreateNetworkServer(0, 2237, #PB_Network_UDP)
Debug "Server started on port 2237"
Repeat
Event = NetworkServerEvent()
If Event
ClientID = EventClient()
If Event = #PB_NetworkEvent_Data
Size = ReceiveNetworkData(ClientID, *Buffer, 1024)
If Size > 4
Debug "Got Long: " + Hex(PeekL(*Buffer), #PB_Long)
If PeekL(*Buffer) = $DABCCBAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf PeekL(*Buffer) = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Debug "Got: " + Hex(PeekL(*Buffer), #PB_Long)
Debug "Got: " + Hex(PeekU(*Buffer), #PB_Byte)
Debug "Got: " + Hex(PeekU(*Buffer+1), #PB_Byte)
Debug "Got: " + Hex(PeekU(*Buffer+2), #PB_Byte)
Debug "Got: " + Hex(PeekU(*Buffer+3), #PB_Byte)
If (PeekU(*Buffer) = $AD And PeekU(*Buffer + 1) = $BC And PeekU(*Buffer + 2) = $CB And PeekU(*Buffer + 3) = $DA)
Debug "Got right packet"
EndIf
EndIf
EndIf
EndIf
Until Event = #PB_NetworkEvent_Disconnect
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can not create server!")
EndIf
FreeMemory(*Buffer)
I got output in the debugger window:
Got Long: DACBBCAD
Got: DACBBCAD
Got: AD
Got: BC
Got: CB
Got: DA
So, expression (PeekU(*Buffer) = $AD And PeekU(*Buffer + 1) = $BC And PeekU(*Buffer + 2) = $CB And PeekU(*Buffer + 3) = $DA) and PeekL(*Buffer) = $ADBCCBDA is every time is false

Re: Strange issue with IF and Peek
Posted: Fri Jun 27, 2025 7:53 pm
by mk-soft
Comparisons are always integer (signed)
PeekL(x) delivers Signed Long becomes the Signed Integer.
Code: Select all
Structure ArrayOfByte
StructureUnion
b.b[0]
a.a[0]
EndStructureUnion
EndStructure
*buffer.ArrayOfByte = AllocateMemory(16)
*buffer\a[0] = $DA
*buffer\a[1] = $CB
*buffer\a[2] = $BC
*buffer\a[3] = $AD
Macro ULONG(X)
($FFFFFFFF & X)
EndMacro
Debug "Got Long: " + Hex(PeekL(*buffer), #PB_Long)
Debug "Signed PeekL = " + Str(PeekL(*buffer))
Debug "Unsigned PeekL = " + Str(ULONG(PeekL(*buffer)))
Debug "Const = " + $DABCCBAD ; Integer
Debug "Const = " + $ADBCCBDA ; Integer
Macro PeekUL(X)
(PeekL(x) & $FFFFFFFF)
EndMacro
If PeekUL(*Buffer) = $DABCCBAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf PeekUL(*Buffer) = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Unfortunately, there is no Unsigned Long under PB
P.S.
It is better to work with structures. The peek and poke functions are basic like and useful, but with structures easier to access data.
Code: Select all
Structure ArrayOfByte
StructureUnion
b.b[0]
a.a[0]
EndStructureUnion
EndStructure
*buffer.ArrayOfByte = AllocateMemory(16)
*buffer\a[0] = $DA
*buffer\a[1] = $CB
*buffer\a[2] = $BC
*buffer\a[3] = $AD
; ----
Structure strReceiveData
Id.l
Dat.a[0]
EndStructure
*recv.strReceiveData = *buffer
If *recv\Id = $DABCCBAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf *recv\Id = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Re: Strange issue with IF and Peek
Posted: Fri Jun 27, 2025 9:06 pm
by dibor
In other words I can NOT to use long and quad in the comparisons?
Re: Strange issue with IF and Peek
Posted: Fri Jun 27, 2025 9:14 pm
by mk-soft
X64:
A signed long (32bit) is converted from a signed long (32bit) to a signed integer (64bit).
Through a binary filter $FFFFFFFF you can view the long part as unsigned
Re: Strange issue with IF and Peek
Posted: Fri Jun 27, 2025 9:25 pm
by dibor
I do not big programmer but doesn't saw this restriction in the comparisons in any other languages
Compiler do not gave any warnings or errors - simple doesn't work.
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 12:44 am
by mk-soft
Edit
In other languages, the type must also be specified.
Hard to explain ...
With PureBasic, the type is automatically adjusted.
1. PeekL returns a signed value. So a type adjustment from signed long to signed integer, so that an assignment to an integer variable is correct.
2. A $[HEX VALUE] is always an integer, as no type is specified here. In your case a positive value.
3. A comparison is standard of type Integer.
4. However, if the first variable in a comparison is of type Long, the following comparison values are adjusted to Long.
Edit
Code: Select all
Structure ArrayOfByte
StructureUnion
b.b[0]
a.a[0]
EndStructureUnion
EndStructure
*buffer.ArrayOfByte = AllocateMemory(16)
*buffer\a[0] = $DA
*buffer\a[1] = $CB
*buffer\a[2] = $BC
*buffer\a[3] = $AD
longVal.l = PeekL(*buffer)
If longVal = $DACBBCAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf longVal = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
*buffer\a[0] = $AD
*buffer\a[1] = $BC
*buffer\a[2] = $CB
*buffer\a[3] = $DA
longVal.l = PeekL(*buffer)
If longVal = $DACBBCAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf longVal = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 12:39 pm
by mk-soft
Post edited above

Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 2:48 pm
by HeX0R
no one saw the main error in the initial code?
Code: Select all
If (PeekA(*Buffer) = $AD And PeekA(*Buffer + 1) = $BC And PeekA(*Buffer + 2) = $CB And PeekA(*Buffer + 3) = $DA)
Debug "Got right packet"
EndIf
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 6:33 pm
by NicTheQuick
Why do you wait for more than 4 bytes if you only need 4?
Do you always send more than 4?
And why do yo ignore the data if less was received? You should buffer it until it reaches 4 bytes.
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 7:29 pm
by infratec
And ...
Code: Select all
If PeekL(*Buffer) = $DABCCBAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf PeekL(*Buffer) = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Little endian: DABCCBAD
Big endian: ADCBBCDA and not ADBCCBDA
The comparrison with PeekL() is wrong.
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 9:12 pm
by dibor
HeX0R wrote: Sat Jun 28, 2025 2:48 pm
no one saw the main error in the initial code?
Code: Select all
If (PeekA(*Buffer) = $AD And PeekA(*Buffer + 1) = $BC And PeekA(*Buffer + 2) = $CB And PeekA(*Buffer + 3) = $DA)
Debug "Got right packet"
EndIf
Are U RIGHT!!
PeekA work!
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 9:15 pm
by dibor
NicTheQuick wrote: Sat Jun 28, 2025 6:33 pm
Why do you wait for more than 4 bytes if you only need 4?
Do you always send more than 4?
And why do yo ignore the data if less was received? You should buffer it until it reaches 4 bytes.
Because 4 first bytes are preamble of the right message.
Re: Strange issue with IF and Peek
Posted: Sat Jun 28, 2025 11:52 pm
by mk-soft
infratec wrote: Sat Jun 28, 2025 7:29 pm
And ...
Code: Select all
If PeekL(*Buffer) = $DABCCBAD ; Little-endian порядок
Debug "Got right packet (Little-endian)"
ElseIf PeekL(*Buffer) = $ADBCCBDA ; Big-endian порядок
Debug "Got right packet (Big-endian)"
EndIf
Little endian: DABCCBAD
Big endian: ADCBBCDA and not ADBCCBDA
The comparrison with PeekL() is wrong.
The comparison is still wrong because PeekL returns a signed integer.
Thus, the peek value is negative and the hex value is positive