Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# If there a quick way to convert a cardinal value into 4, 8-bit bytes?

Posted on 2011-02-15
Medium Priority
543 Views
I would like to be able to break apart, unsigned 32-bit integer values into 4 "byte" values of 8-bits each. (For best viewing please paste below into notepad and use courier new font).

Example: cardinal value is:

0 1 0 0 1 0 1 0   0 1 0 1 1 0 1 0   0 1 0 1 0 0 1 1   1 1 0 1 0 1 0 0    (1247433684 dec)

and I like to break it apart into 4 8-bit bytes:

0 1 0 0 1 0 1 0  ( 74)
0 1 0 1 1 0 1 0  ( 90)
0 1 0 1 0 0 1 1  ( 83)
1 1 0 1 0 1 0 0  (212)

I will ask a follow-on question to re-combine the 4 bytes into 1 cardinal value the most direct way (without multipying?).

TIA,  Ed
0
Question by:Ed Covney
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 5
• 2

LVL 32

Expert Comment

ID: 34901167
type cast to ByteArray

``````var
X: cardinal;
I, J: Byte;
begin
X := 1247433684;
I := PByteArray(PCardinal(@X))[0];
J := PByteArray(PCardinal(@X))[1];
ShowMessage(IntToStr(I) + '   ' + IntToStr(I) );
``````
0

LVL 32

Expert Comment

ID: 34901213
``````function IntToBinary(Int: Integer; Digits: Byte): string;
const
CONVERT:array[0..1] of Char = '01';
var
cnt: Integer;
begin
SetLength(Result, Digits);
for cnt := Digits downto 1 do
begin
Result[cnt] := CONVERT[Abs(Int) mod 2];
Int := Int shr 1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
X: cardinal;
I: Byte;
begin
X := 1247433684;
I := PByteArray(PCardinal(@X))[0];
ShowMessage(IntToBinary(I, 8));
end;
``````
0

LVL 32

Accepted Solution

Ephraim Wangoya earned 2000 total points
ID: 34902039
Here is a better example

``````function IntToBinary(Int: Integer; Digits: Byte): string;
const
CONVERT:array[0..1] of Char = '01';
var
Cnt: Integer;
begin
SetLength(Result, Digits);
for Cnt := Digits downto 1 do
begin
Result[Cnt] := CONVERT[Abs(Int) mod 2];
Int := Int shr 1;
end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
I: Integer;
BArray: array[0..3] of Byte;
Value: Cardinal;
TempStr: string;
begin
Value := 1247433684;
for I := 0 to 3 do
BArray[I] := PByteArray(PCardinal(@Value))[I];

//display
for I := 0 to 3 do
TempStr := TempStr + IntToBinary(BArray[I], 8) +  ' - ' + IntToStr(BArray[I]) + #13#10;
ShowMessage(TempStr);
end;
``````
0

LVL 32

Expert Comment

ID: 34902086
To convert the bytes back to cardinal, just do the reverse
``````procedure TForm3.Button2Click(Sender: TObject);
var
BArray: array[0..3] of Byte;
Value: Cardinal;
begin
BArray[0] := 212;
BArray[1] := 83;
BArray[2] := 90;
BArray[3] := 74;

Value := PCardinal(PByteArray(@BArray[0]))^;
ShowMessage(IntToStr(Value));
end;
``````
0

LVL 3

Author Comment

ID: 34902117
wow, wow, wow.
Other the begin and end, I don't understand one line of your function code, but it works and works so darn well, I just can't believe what I'm seeing here.  I had to do 1,000,000,000 iterations before I noticed about a 3 second pause. That's over 1,000,000,000 conversions per second. And I'm using a 2.6 GHz PC, not exactly the fastest on the block . . . or even in the room!!!

ewangoya - I just can't thank you enough. Thank you, thank you, thank you . . . . .

Ed

``````var
X: cardinal;
I, J, K, L: Byte;
begin
X := 1247433524;
for x := 0147433524 to 1247433524 do begin
I := PByteArray(PCardinal(@X))[0];
J := PByteArray(PCardinal(@X))[1];
K := PByteArray(PCardinal(@X))[2];
L := PByteArray(PCardinal(@X))[3];
end;
ShowMessage(IntToBinary(I,8)+#13#10+IntToBinary(J,8)+#13#10+IntToBinary(K,8)+#13#10+IntToBinary(L,8) );
ShowMessage(IntToStr(I)+IntToStr(J)+IntToStr(K)+IntToStr(L) );
ShowMessage(Chr(I)+Chr(J)+Chr(K)+Chr(L) );
``````
0

LVL 3

Author Closing Comment

ID: 34902148
The solution involved Assembler, which I'll never understand but I will ALWAYS appreciate. Without it, my code would be an order of magnitude (or more) slower.

EWANGOYA rocks !!
0

LVL 32

Expert Comment

ID: 34902153

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Linear search (searching each index in an array one by one) works almost everywhere but it is not optimal in many cases. Let's assume, we have a book which hasÂ 42949672960Â pages. We also have a table of contents.Â Now we want to read the content on pâ€¦
The greatest common divisor (gcd) of two positive integers is their largest common divisor. Let's consider two numbers 12 and 20. The divisors of 12 are 1, 2, 3, 4, 6, 12 The divisors of 20 are 1, 2, 4, 5, 10 20 The highest number among the câ€¦
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201â€¦
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increasedâ€¦
###### Suggested Courses
Course of the Month11 days, 8 hours left to enroll