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

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with Premium.
Start your 7-day free trial.

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trialThe 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

Programming

From novice to tech pro — start learning today.

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with Premium.
Start your 7-day free trial.

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.