|
.net has base64 encoding:
byte[] data = ...;
string jpgData = Convert.ToBase64String(data);
to convert back to bytes
byte[] data = Convert.FromBase64String(jpgData);
|
|
|
|
|
You can also use the ToBase64Transform and FromBase64Transform , which are a little more stream-friendly. These can be found in the System.Security.Cryptography namespace. The Convert class is okay when you're dealing with small buffers, but potentially large buffers like would be required for images you'd want buffer when possible. For instance, when sending data like this across the wire, you could buffer the bytes to a NetworkStream , transforming the byte[] array to base64 and sending that across the wire (also see Encoding to send this transformed byte[] buffer in the encoding of your choice, like UTF-8 for "application/x-www-form-urlencoded" MIME for an HTTP POST).
See the FromBase64Transform constructor in the .NET Framework SDK for an example.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
See if this is what you want:
System.IO.FileStream stream = new System.IO.FileStream("Image.bmp", System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Close();
string str;
for(int i=0;i<stream.Length;i++)
str += buffer[i].ToString()+" ";
Mazy
You're face to face,
With the man who sold the world - David Bowie
|
|
|
|
|
No, use base64 encoding. See the replies above. Coming up with your own encodings will kill you in the end because nothing else will understand your encoding so it can't decode it. Besides, this will create unnecessary string parsing (you'll have to parse each space-separate integer and convert that to a byte before you can even create your buffer, not to mention that it'll take an extra parsing process to even figure out how big the buffer should be).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Ok.
Mazy
You're face to face,
With the man who sold the world - David Bowie
|
|
|
|
|
Hi
Can any1 tell me how I can print "UnPrintable" ASCII characters in a Textbox ???
raheel
|
|
|
|
|
If they aren't "printable", then they'll be displayed as square boxes (typically). Either way, you must escape the characters. For the Unicode character set (which .NET uses internally for strings), you can use "\uXXXX" - where each "X" represents a hexidecimal value - with the Unicode character (which could be in the ASCII range, such as "\u000a" for the line feed (decimal value 10). You can also use "\xX" - where "X" is a variable number of hexidecimal values - like "\x0a" (decimal value 10), which is also the line feed. Depending on other properties in your TextBox , these might in fact insert line feeds and tabs.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
hi,
i want to append a tsruct every x seconds to a binary file, but i don't get it.
here is the code of the struct:
<br />
public struct abc<br />
{<br />
public DateTime abcDate;<br />
public float abcFloat;<br />
}<br />
how can i append this struct to a binary file?
Thanks,
Dennis
|
|
|
|
|
Open the binary file into a Stream (or a derivative, like FileStream ) and write the two members. You don't need to include a header if the struct fields are fixed-width (the DateTime field is always 64 bits if you use Ticks or 32 bits if you use Milliseconds , and the Single (float) is always 32 bits). If you use a BinaryWriter (can take the Stream you opened as an argument), you can use the overloaded Write method to easily write these fields:
FileStream stream = File.Open("path.bin", FileMode.Append, FileAccess.ReadWrite, FileShare.Read);
BinaryWriter writer = new BinaryWriter(stream);
while (false)
{
abc val = new abc();
val.abcDate = DateTime.Now;
val.abcFloat = 1.0f;
writer.Write(val.abcDate.Ticks);
writer.Write(val.abcFloat);
Thread.Sleep(1000);
}
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks a lot, seems to work!
I'm still not quite sure if it's running ok, because i don't get the bytes out of the file correct. How do i have to assign the bytes to the datetime ?
Thanks,
Dennis
|
|
|
|
|
You don't read the bytes directly, unless you want to take all the Types into account. Use a BinaryReader and call ReadInt64 to get the ticks or ReadInt32 to get the milliseconds. Next, read the struct documentation for DateTime in the .NET Framework SDK. There are several constructor overloads, some of which accept either the ticks or milliseconds.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi.
How can i prevent a user from changing tabpage without removing tabpages and without the flicker that occurs if i in the selectedIndexChanged event set it back to the original tabpage?
It seems that all events a raised AFTER the tabpage changed.... even the various mouse events...
|
|
|
|
|
Yes, of course it's called after. It is SelectedIndexChanged afterall.
In order to prevent this, you're going to have to derive from TabControl and override WndProc and handle the TCN_SELCHANGING (-552). Return true to prevent the change:
private const int TCN_SELCHANGING = -552;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == TCN_SELCHANGING)
{
if (!allowChange) m.Result = new IntPtr(1);
}
}
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Forgive me, but I'm a little confused.
Heath Stewart wrote:
private const int TCN_SELCHANGING = -552;
I'm assuming that's from CommCtrl.h :
#define TCN_FIRST (0U-550U) // tab control
...
#define TCN_SELCHANGING (TCN_FIRST - 2)
But the MSDN library has the following definition for WindowProc:
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
Which leads me to believe that uMsg will never be -552.
To test it, I derived a control from TabControl and overrode WndProc as such:
protected override void WndProc(ref Message m) {
Console.WriteLine(m.Msg);
base.WndProc (ref m);
}
I added my tab control to a form, gave it a few tabpages and ran it. Sure enough, every value printed as I clicked and poked and prodded was a positive integer.
I started programming with .NET, so I don't have any prior experience with windows messages and I'm obviously missing something, but I can't figure it out. I've been searching the documentation for the last hour trying to make sense of it, with no luck.
|
|
|
|
|
The fact that the number looks negative to you doesn't mean it's negative to a CPU. The runtime doesn't really care, either, except when it comes time to compare or display the value. The Type of the value type will determine if it can be negative or not.
A 32-bit signed integer such as -552 is the same as the 32-bit unsigned integer 0xfffffdd8. When taking into account unsigned equivalents, this is 4294966744.
Unfortunately, this only would've applied if the const was defined as a UInt32 (uint keyword). Sorry about the confusion. Instead, define your constant int as the hex value given above and it should work.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Please forgive me if I'm being exceptionally dense, but it's still not clear to me.
Heath Stewart wrote:
A 32-bit signed integer such as -552 is the same as the 32-bit unsigned integer 0xfffffdd8. When taking into account unsigned equivalents, this is 4294966744.
Thank you for explaining this. This part makes perfect sense to me, that's not the problem.
The range for TabControl messages, according to CommCtrl.h is -550 to -580. None of the value I get from my tab control is even close to this range. Switching back and forth between pages, selecting controls on the pages, hiding and showing the form... all of them return message IDs of 0-675
Heath Stewart wrote:
define your constant int as the hex value given above and it should work.
I can't do this because 0xffffdd8 is beyond the valid range of values for an int . Using a long or unit would be pointless because the Msg poperty of Message is of type int .
const int TCN_SELCHANGING = -552;
protected override void WndProc(ref Message m) {
Debug.Assert(m.Msg != TCN_SELCHANGING);
base.WndProc (ref m);
}
|
|
|
|
|
It wouldn't be pointless to define a uint because you can always cast it to an int upon comparing, but I wouldn't recommend it since this method should be fast (it has to process potentially a lot of messages, after all) and the extra instruction to cast (and possibly two more to store and retrieve depending on the code) is too expensive.
Fortunately, I re-read the documentation for TCN_SELCHANGING and noticed that this message is sent in the form of a WM_NOTIFY message to the parent of the TabControl . This little example works:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class Test : Form
{
public static void Main()
{
Application.Run(new Test());
}
public Test()
{
TabControl tab = new TabControl();
this.SuspendLayout();
this.Text = "Test";
this.Controls.Add(tab);
tab.TabPages.Add(new TabPage("Page 1"));
tab.TabPages.Add(new TabPage("Page 2"));
tab.Dock = DockStyle.Fill;
this.ResumeLayout();
}
private const int WM_NOTIFY = 0x004e;
private const int TCN_SELCHANGING = -552;
private struct NMHDR
{
public IntPtr hwndFrom;
public int idFrom;
public int code;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NOTIFY)
{
NMHDR hdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
Console.WriteLine(hdr.code);
if (hdr.code == TCN_SELCHANGING)
m.Result = new IntPtr(1);
}
}
} Sorry for the mess. Most messages I deal with are sent directly and aren't WM_NOTIFY style messages. This gets a little quirky. You'll notice I marshal the LPARAM parameter to an NMHDR struct, which I then check the code. Getting to know the notification messages helps, I just feel dumb that I didn't fully read it before.
Also note that I'm calling base.WndProc first. If you don't, Windows is likely to change the Message.Result field to 0 (or reset it to 0). You could also just not call it and return in this case if you get the WM_NOTIFY message with the NMHDR.code set to TCN_SELCHANGING .
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
That is a beautiful thing.
I started programming with .NET and have always been somewhat uncomfortable when it comes to anything outside the framework, although I am reasonably adept at programming within it.
Thank you, Heath, for your help. It's a small thing, I know, but it helped me tremendously.
|
|
|
|
|
Hi.
I just tried this and it works just fine. Great
However, it is still possible to change the tab by pressing the default shortcutkey (ctrl + tab).
I want to be able to control this too. My guess is that all I have to do is add a check do compare to a different messagenumber. Is this correct? If so, Do you have a link to som docs where I can find this number?
I would also like to know if it is possible to detect which tabpage he pressed. for example:
If the user is on tabpage1, he can go to tabpage 2 but NOT to tabpage 3.
To be able to do this, I need to know which tabpage he clicked
Thanks so far.
|
|
|
|
|
As with all Windows Common Controls, you can find these in the Platform SDK on MSDN Library Online[^]. For the common controls, see http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/wincontrols.asp[^]. Under "Individual Controls" you'll find documentation on the control messages you want. You should take a look at the rest of the stuff, too.
You can try overriding OnKeyDown , although IIRC Ctrl+Tab is handled a little differently. You can find more information about handling the notification messages in the application pump (using an IMessageFilter perhaps) if this is the case in the .NET Framework SDK (find the interface in the help index I mentioned) and in the Platform SDK.
In order to determine which tab he clicked on, you're going to have to do a lot of this yourself. You can override the OnMouseDown event which gives you coordinates relative to the client (TabControl ). Then enumerate your TabPage s and call TabControl.GetTabRect with each one (or rather, their index) and use Rectangle.Contains to see which they clicked on. Other ways most likely won't work because you stopped the tabs from changing, so the other messages that fire events in .NET won't be sent and received.
In cases when you derive a control, you should override the OnEvent method, calling base.OnEvent before or after your code (depending on the circumstances). Handle these events from outside the class. This improves performance slightly and makes for a better polymorphic design.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
How can I in my winform display picture or icons in one of the columns in my datagrid?
|
|
|
|
|
By writing your own DataGridColumnStyle class. There are many examples out there that describe hosting a ComboBox in a DataGridColumnStyle , and these wouldn't be hard to adapt and use a PictureBox instead. If you want, you wouldn't even have to worry about the editing if you want this image to be read-only (the editing is the most difficult part). Just make sure your query returns a BLOB (which you can read into a Stream , like a MemoryStream ) or a path to an image.
For a good example of hosting a ComboBox in a DataGridColumnStyle , see http://msdn.microsoft.com/msdnmag/issues/03/08/DataGrids/[^]. It includes examples and sample source.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
hi,
table containing fileds code,name. in the name field i need query to retrive repeated datas and code is not same. any one help to me. thanks in advance.
Have A Nice Day!
Murali.M
|
|
|
|
|
|
<br />
private void btnAddP_Click(object sender, System.EventArgs e)<br />
{<br />
<br />
try<br />
{<br />
createSqlConnection();<br />
<br />
if ( txtName.Text != "" && txtHPNO.Text != "")<br />
{<br />
myCommand = new SqlCommand("INSERT INTO Patient(Acct ID, Name, Age, Height, Weight, Address, IcNo, HomeNo, HpNo, EName, EPhoneNo, ERelation, Date, Status, Remarks) VALUES('"+@txtAcctId.Text+"','"+@txtName.Text+"','"+@txtAge.Text+"','"+@txtHeight.Text+"','"+@txtWeight.Text+"','"+@txtAdd.Text="','"+@txtICNO.Text+"','"+@txtHomeNo.Text+"','"+@txtHPNO.Text+"','"+@txtEName.Text+"','"+@txtEPhoneNo.Text+"','"+@txtERelation.Text+"','"+@dTimeDate.Text+"','"+@txtStatus.Text+"','"+@txtRemarks.Text+"')",myConnection);<br />
<br />
MessageBox.Show("Creating New Patient Record.....", "Information");<br />
<br />
myCommand.ExecuteNonQuery();<br />
<br />
MessageBox.Show("New Patient Record Created","Information");<br />
<br />
myConnection.Close();<br />
}<br />
<br />
else<br />
{<br />
MessageBox.Show("All Text Boxes Should be Filled with Information","Reminder");<br />
}<br />
}<br />
<br />
catch (Exception error1)<br />
{<br />
MessageBox.Show(error1.ToString());<br />
}<br />
when i compile the .cs file i get an error..can anyone tell me whats wrong
D:\ASGill\D E G R E E\D. Final Year Project (7)\SOFTWARE\C.I.System\CLINICINFORMATIONSYSTEM\AddPatient.cs(534): The left-hand side of an assignment must be a variable, property or indexer
what does it mean?...
thx
Arvinder Gill
|
|
|
|
|