BYTE array size

C

Chunekit Pong

I have a BYTE array -
BYTE const* pbBinary

I would like to know how many bytes in that byte array

but if I do - sizeof(* pbBinary); - then I got 1
but if I do - sizeof( pbBinary); - then I got 4

I am sure the array has hundreds of bytes

how can I do that?

======================

BYTE const* pbBinary = &bytes[0];
int size = sizeof( pbBinary);
 
F

Fred Zwarts

Chunekit Pong said:
I have a BYTE array -
BYTE const* pbBinary

You don't have a BYTE array, you have a pointer to BYTE.
(What is a BYTE?)
I would like to know how many bytes in that byte array

but if I do - sizeof(* pbBinary); - then I got 1
but if I do - sizeof( pbBinary); - then I got 4

I am sure the array has hundreds of bytes

how can I do that?

Without other information you can't.
 
M

mliptak

I have a BYTE array  -
BYTE const* pbBinary

I would like to know how many bytes in that byte array

but if I do -  sizeof(* pbBinary);  - then I got 1
but if I do - sizeof( pbBinary); - then I got 4

I am sure the array has hundreds of bytes

pbBinary is just a pointer.. it does not store the information about
number of bytes/elements it points to
if you care about the size of an "array", use std::vector<> instead.
m.
 
C

Chunekit Pong

You don't have a BYTE array, you have a pointer to BYTE.
(What is a BYTE?)


Without other information you can't.

The whole code is like this - the purpose is to convert binary file
into a Base64 string
=================
typedef unsigned char BYTE;
std::ifstream file1("c:/test2.png");

// read from test2.png into BYTE array
std::vector<BYTE> bytes(
(std::istreambuf_iterator<char>(file1))
, (std::istreambuf_iterator<char>())
);
if(bytes.empty())
; // no bytes have been read

BYTE const* pbBinary = &bytes[0];
int size = sizeof(pbBinary);

unsigned long ulEncLen = 0;
char *pEncOut = NULL;

BOOL fRet = ::CryptBinaryToString( pbBinary, size,
CRYPT_STRING_BASE64, pEncOut, &ulEncLen );
====================
BOOL WINAPI CryptBinaryToString(
__in const BYTE *pbBinary,
__in DWORD cbBinary,
__in DWORD dwFlags,
__out_opt LPTSTR pszString,
__inout DWORD *pcchString
);
 
F

Fred Zwarts

Chunekit Pong said:
You don't have a BYTE array, you have a pointer to BYTE.
(What is a BYTE?)


Without other information you can't.

The whole code is like this - the purpose is to convert binary file
into a Base64 string
=================
typedef unsigned char BYTE;
std::ifstream file1("c:/test2.png");

// read from test2.png into BYTE array
std::vector<BYTE> bytes(
(std::istreambuf_iterator<char>(file1))
, (std::istreambuf_iterator<char>())
);
if(bytes.empty())
; // no bytes have been read

BYTE const* pbBinary = &bytes[0];
int size = sizeof(pbBinary);

bytes.size () gives you the size of the vector.
 
T

Tonni Tielens

The whole code is like this - the purpose is to convert binary file

You cannot get the size of an array, by doing sizeof on a pointer to
an external array. Only if the pointer is in fact declared as a
statically dimensioned array (eg. BYTE pbBinary[10]) you can get the
size of the array by doing sizeof(pbBinary). In your case you are in
the same scope, but still pbBinary is considered as a pointer to a
dynamically allocated or external array. Note that sizeof is
calculated compile time, and when you declare a pointer to an array,
the compiler CANNOT know what the size of the array will be to what
the pointer will point at runtime.
 
R

Rolf Magnus

Chunekit said:
I have a BYTE array -
BYTE const* pbBinary

I would like to know how many bytes in that byte array

but if I do - sizeof(* pbBinary); - then I got 1

Well, *pbBinary is a BYTE, so you get the size of a BYTE.
but if I do - sizeof( pbBinary); - then I got 4

pbBinary is a pointer to const BYTE, so you get the size of a pointer to
const BYTE.
I am sure the array has hundreds of bytes

how can I do that?

You can't, unless the array contains some end marker that you can use to find
out.
 
J

James Kanze

You cannot get the size of an array, by doing sizeof on a
pointer to an external array.

I know what you mean, but you really should say that you can't
get the size of an array given a pointer to its first element.
(Pointers to arrays, i.e. BYTE (*p)[ 200 ], exist, and in such
cases, sizeof( *p ) would be useful. But they aren't very
idiomatic.)
Only if the pointer is in fact declared as a statically
dimensioned array (eg. BYTE pbBinary[10]) you can get the size
of the array by doing sizeof(pbBinary).

If something is declared as an array, it's not a pointer.
 
J

James Kanze

I have a BYTE array -
BYTE const* pbBinary
I would like to know how many bytes in that byte array
but if I do - sizeof(* pbBinary); - then I got 1
but if I do - sizeof( pbBinary); - then I got 4
I am sure the array has hundreds of bytes

Ask whoever created the array to tell you. Once the array has
been converted to a pointer to the first element, all
information concerning the size has been lost.

A better solution might be to use std::vector.
 
Z

zr

You don't have a BYTE array, you have a pointer to BYTE.
(What is a BYTE?)
Without other information you can't.

The whole code is like this - the purpose is to convert binary file
into a Base64 string
=================
                typedef unsigned char BYTE;
                std::ifstream file1("c:/test2.png");

                // read from test2.png into BYTE array
                std::vector<BYTE> bytes(
                        (std::istreambuf_iterator<char>(file1))
                        , (std::istreambuf_iterator<char>())
                        );
                if(bytes.empty())
                        ; // no bytes have been read

                BYTE const* pbBinary = &bytes[0];
                int size = sizeof(pbBinary);

                unsigned long ulEncLen = 0;
                char *pEncOut = NULL;

                BOOL fRet = ::CryptBinaryToString( pbBinary, size,
CRYPT_STRING_BASE64, pEncOut, &ulEncLen );
====================
BOOL WINAPI CryptBinaryToString(
  __in       const BYTE *pbBinary,
  __in       DWORD cbBinary,
  __in       DWORD dwFlags,
  __out_opt  LPTSTR pszString,
  __inout    DWORD *pcchString
);

The previous posters have explained the problem. A possible fix to
your program:

Instead of:
int size = sizeof(pbBinary);
Try:
int size = bytes.size();
 
A

Andre Kostur

You don't have a BYTE array, you have a pointer to BYTE.
(What is a BYTE?)


Without other information you can't.

The whole code is like this - the purpose is to convert binary file
into a Base64 string
=================
typedef unsigned char BYTE;
std::ifstream file1("c:/test2.png");

// read from test2.png into BYTE array
std::vector<BYTE> bytes(
(std::istreambuf_iterator<char>(file1))
, (std::istreambuf_iterator<char>())
);
if(bytes.empty())
; // no bytes have been read

BYTE const* pbBinary = &bytes[0];
int size = sizeof(pbBinary);

Why bother to make pbBinary and size ?
unsigned long ulEncLen = 0;
char *pEncOut = NULL;

BOOL fRet = ::CryptBinaryToString( pbBinary, size,
CRYPT_STRING_BASE64, pEncOut, &ulEncLen );


Why not:

BOOL fRet = ::CryptBinaryToString(&bytes[0], bytes.size(),
CRYPT__STRING_BASE64, pEncOut, &ulEncLen);

?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,817
Latest member
AdalbertoT

Latest Threads

Top