I
Ilya Tumanov [MS]
I suspect bioData[3] is an object. If so, you should cast it to whatever
type it is (e.g. Int32).
Next, cast it to whatever type you need:
System.UInt16 formatowner = unchecked( (System.UInt16) ((Int32)bioData[3])
);
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
<[email protected]> <[email protected]>
<[email protected]>
<[email protected]>
type it is (e.g. Int32).
Next, cast it to whatever type you need:
System.UInt16 formatowner = unchecked( (System.UInt16) ((Int32)bioData[3])
);
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
<[email protected]> <[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Thu, 14 Apr 2005 03:03:36 +0100
Lines: 840
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26929
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework
can't get it through:/
I ended up trying to store the value as int, which I guess would make sense
because an unsigned value cannot be stored in Sql, and the next thing up I
could find after smallint was int. Please tell me if I'm wrong. It does make
sense to me..
However, casting back to UInt16 really does not work. I'm doing the
following right now :
System.UInt16 formatowner = (System.UInt16)(unchecked((bioData[3])));
I checked the value of bioData[3], it's always 53242:
bioData[3]
{53242}
System.ValueType: {System.Int32}
m_value: 53242
MaxValue: 2147483647
MinValue: -2147483648
I don't even think that I should use the unchecked() statement, I guess it's
just for reassurance. Why would the following raise an invalid cast
exception?
kind"Ilya Tumanov [MS]" said:You can get data out of SQL CE as Int16 and cast it to UInt16 using
unchecked().
Similarly, cast UInt16 to Int16 to store it.
Another solution would be to declare valuables as signed and let native
code to do interpretation.
That might be problematic if you set values manually somewhere, but it can
be done with unchecked().
Or, you can use equivalent values. For example binary representations of
65535 unsigned and -1 signed for 16 bit values are exactly the same.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
<[email protected]> <[email protected]>
Subject: Re: To cast or not to cast?
Date: Wed, 13 Apr 2005 02:00:11 +0100
Lines: 686
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26864
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework
the "unsafe" keyword worked great! vs doesn't complain anymore.
I'm trying to solve the UInt16 problem now. I followed your previous advice
of using unchecked(). It still says that the value is too small or too large
when trying to insert it in the DB using OleDbType.SmallInt (whichTK2MSFTNGXA01.phx.gbl!TK2MSFTFEED01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP0http://groups-beta.google.com/group...28847ac90ac8a3/b92cb386364174f7?q=unmanaged+ais9.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26785
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework
I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.
I've got the following down. I think the bit I'm missing is the
assignment
to IntPtr? And probably the casting as well.. Could you explain though
what
the compiler means by the first error? I understand that this is an
unsafe
block, so why does it complain?
fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}
I can see two reasons:
1. No need to free the memory after call is done.
2. No time wasted making temporary copy of something you already have.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and confers no
rights.
Why would one want to use unsafe blocks is beyond me, when it
soconferseasy
to call LocalAlloc and Marshal.Copy
--
Alex Feinman
---
Visit http://www.opennetcf.org
It won't, but managed array (retrieved from SQL CE) should be
already
allocated.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, andno
rights.
"<ctacke/>" <ctacke_AT_OpenNETCF_com> wrote in message
Though fixed won't allocate any memory for you, so you're still
where
you were before.
-Chris
message
You don't need to do anything to pin memory with fixed(), fixed()
will
do
it for you:
fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer
points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}
// MyManagedArray in longer pinned...
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework
I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brianstoredtollocate+memory&rnum=10#b92cb386364174f7
I supose I could use LocalAlloc to allocate memory. The post
seems
to
be
similar to my problem but I still don't understand how to pin
managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?
your help is really appreciated!
message
Creating a new pointer is not enough. You need to allocate
memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would
have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already
have.
Before you pass this pointer to a native code, you have
pincorrectlymanaged
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That
would
pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and
confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework
Okay, so I used the 1040 length, it doesn't seem to
complain,
which is
good
news I guess. To make sure it stores the data
I'mtrying
to
retrieve it and feed it back to the biometric template
matching
method.
Because it takes IntPtr's for BiometricData and Signature, I
tried
creating
new pointers and marshal copy the content that I retrieved
earlier
into
these pointers. I failed. I tried the following:
System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an
array
of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr,
1040);//copy
content
of
BiometricData in an IntPtr
"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something...
what
am I
missing here?
in
message
You should not guess the length, you should know it. It
might
be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length
contains
this
size.
You should check out the documentation for the function
you're
calling
to
make sure it's correct.
If value of a pointer is 0, it's null pointer. It means
this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties, and
confers
no
rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID:Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework
Thanks a lot for that! Before going to the UInt16
problem, I
better
try
to
solve that IntPtr problem.
Managed to use Marshal.Copy. Not sure how I should
'guess'
the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me:
2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which ishttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/inFirstBIRSample.Length).
Second Part: Seems like the FirstBIRSample.Signature
(also a
pointer)
is
0,
how should I store this?
Thanks so much!
""Ilya Tumanov [MS]""methodswrote
in
message
While storing UInt16 as Int is OK, it will take more
space.
The
problem
you're having is caused by range check. You might
consider
using
unchecked() to disable it.
System.Runtime.InteropServices.Marshal class allows
you
to
copy
data
from
the pointer to the array. Look into Copy()
ofthat
class.
Best regards,
Ilya
This posting is provided "AS IS" with no warranties,
and
confers
no
rights.<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express
6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2800.1478
Message-ID:IntPtrNewsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework
Thanks so much for the replies Alex and Ilya!
I changed the types in sql. It wasn't happy with
Uint16
mapped
to
smallint
(sql says value is either too small or too large),
so
I
just
went
for
an
int.
Not sure how to retrieve the data data an
ispointing
to
though.
How
can I get that data as a byte array?
thanks so much again!
""Ilya Tumanov [MS]""wrote
in
message