Hello!

While working on a project of mine, I have come across the following functions:

Public Function Convert1(ByRef abytByteArray() As Byte) As Long

Dim lngCounter As Long

Dim lngResult As Long

For lngCounter = 0 To 3

lngResult = lngResult + (abytByteArray(lngCounter) * (2 ^ ((3 - lngCounter) * 7)))

Next lngCounter

Convert1 = lngResult

Exit Function

Public Function Convert2(abytByteArray() As Byte) As Long

Dim lngCounter As Long

Dim lngResult As Long

On Error GoTo ErrorHandler

For lngCounter = 0 To 3

lngResult = ShiftLeft(lngResult, 8) + abytByteArray(lngCounter)

Next lngCounter

Convert2= lngResult

Exit Function

In Convert2, "ShiftLeft" is a function for shifting a value n times to the left.

Let us say you have the following array:

a(0) = 3

a(1) = 35

a(2) = 127

a(3) = 251

Convert1 will return 6881403 and Convert2 will return 52658171.

What exactly do those functions do?

Regards,

Sebastian Mares

While working on a project of mine, I have come across the following functions:

Public Function Convert1(ByRef abytByteArray() As Byte) As Long

Dim lngCounter As Long

Dim lngResult As Long

For lngCounter = 0 To 3

lngResult = lngResult + (abytByteArray(lngCounter)

Next lngCounter

Convert1 = lngResult

Exit Function

Public Function Convert2(abytByteArray() As Byte) As Long

Dim lngCounter As Long

Dim lngResult As Long

On Error GoTo ErrorHandler

For lngCounter = 0 To 3

lngResult = ShiftLeft(lngResult, 8) + abytByteArray(lngCounter)

Next lngCounter

Convert2= lngResult

Exit Function

In Convert2, "ShiftLeft" is a function for shifting a value n times to the left.

Let us say you have the following array:

a(0) = 3

a(1) = 35

a(2) = 127

a(3) = 251

Convert1 will return 6881403 and Convert2 will return 52658171.

What exactly do those functions do?

Regards,

Sebastian Mares

The main problem is with the first function. I have no idea why the powers of two are multiples of 7.

"The ID3v2 tag size is encoded with four bytes where the most

significant bit (bit 7) is set to zero in every byte, making a total

of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is

represented as $00 00 02 01."

This should explain why the powers of 2 are a multiple of 7. :-)

Public Function Convert1(abytByteArray() As Byte) As Long

Dim lngCounter As Long

Dim lngResult As Long

On Error GoTo ErrorHandler

For lngCounter = 0 To 3

lngResult = ShiftLeft(lngResult, 7) + abytByteArray(lngCounter)

Next lngCounter

Convert1= lngResult

Exit Function

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.

The first one sums the entries in the array multiplied by 2 raised to decreasing multiples of seven.

The powers of two are 3*7, 2*7, 1*7, and 0*7, or 21, 14, 7, and 0.

This also has the effect of shifting the entries in the array left by 21, 14, 7, and 0 bits each.

So the final result is array(0)<<21 OR array(1)<<14 OR array(2)<<7 OR array(3).

Or, putting the entries in array into seven bit clumps. Given that your example has arr(3) requiring 8 bits, I'd be much happier if the powers of two were multiples of 8 instead of 7.

In any case, the second one has the effect of making a 32-bit item with the array entries stored left to right, 0 to 3, the result being a long whose value is:

65536*(256*arr(3) + arr(2)) + (256*arr(1)+arr(0) (recall that on Intel CPUs, bytes in integers are stored least significant first).

Note that can also be considered reversing the entries of the array and puting the result into 32 bits.

Given what the second one does, if the multiplier in the first one had been 8, it's result would have been putting the entries in the array into a 32-bit item in the same order as the second.