Bug? Byte arrays and "Select Case"

ema01

Member
Licensed User
Longtime User
I think i found a bug with select case.
I'm using B4i V5.30 but this has been there from before, because i remember writing a workaround in a hurry many months ago.

I have a set of bytes that come from a bluetooth communication, i put the bytes in a byte array ("frame") and the byte array in a list.
So far so good.

Then the head of the frame (byte in position zero) is checked in a Select Case statement to select how to interpret the following data.

However, the app wasn't entering the required case and i had to work around it by doing an IF check in the "case else" statement.

This is the code i used to test (I apologize for not going up to 255 but this is enough, i had problems with value "144")

B4X:
'Test byte
   Dim tstByte(6) As Byte
  
   tstByte(0) = 0
   For idx = 0 To 159
       tstByte(0) = idx
       Select Case tstByte(0)
           Case 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
               Log(tstByte(0) & " Correct")
           Case 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
               Log(tstByte(0) & " Correct")
           Case 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129
               Log(tstByte(0) & " Correct")
           Case 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
               Log(tstByte(0) & " Correct")
           Case Else
               Log(tstByte(0) & " Wrong")
       End Select
   Next
  
   Dim tstSingleByte As Byte
  
   tstSingleByte = 0
   For idx = 0 To 159
       tstSingleByte = idx
       Select Case tstSingleByte
           Case 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
               Log(tstSingleByte & " Correct")
           Case 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
               Log(tstSingleByte & " Correct")
           Case 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129
               Log(tstSingleByte & " Correct")
           Case 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
               Log(tstSingleByte & " Correct")
           Case Else
               Log(tstSingleByte & " Wrong")
       End Select
   Next

The behaviour is different in the two cases for values over 127.

for tstSingleByte the logs are
B4X:
127 Correct
-128 Correct
because in B4i bytes are signed (would have preferred unsigned bytes but whatever.)

for tstByte(0) instead
B4X:
127 Correct
128 Wrong
And here we see that the byte is interpreted as UNSIGNED and the comparison fails.
checking the byte with "if" instead works correctly.

the B4A version of the application doesn't have this issue
 
Top