开发者

Byte to integer in C#

开发者 https://www.devze.com 2023-01-03 08:15 出处:网络
I am reading a row from a SQL Server table. One of the columns is of t开发者_如何学Pythonype tinyint.

I am reading a row from a SQL Server table. One of the columns is of t开发者_如何学Pythonype tinyint.

I want to get the value into an int or int32 variable.

rdr.GetByte(j)
(byte) rdr.GetValue(j)

...seems to be the only way to retrieve the value. But how do I get the result into an int variable?


int value = rdr.GetByte(j);

An explicit cast is not required, because a byte to int is a widening conversion (no possibility of data loss).


See the documentation for BitConverter.ToInt32 (contains more examples):

byte[] bytes = { 0, 0, 0, 25 };

// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
    Array.Reverse(bytes);

int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25


Assigning a byte to an int works:

int myInt = myByte;

But maybe you're getting an exception inside IDataRecord.GetByte, in which case you should check that the index you're using to access the data record really points to a tinyint column. You can check the type returned from GetValue. It should be a byte for a tinyint column.

Trace.Assert(rdr.GetValue(j).GetType() == typeof(byte));

Another option is to forego the fragile numeric index altogether:

int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn))


(int)rdr.GetByte(j)


Casting the byte to int should work just fine:

int myInt = (int) rdr.GetByte(j);

Since C# supports implicit conversions from byte to int, you can alternatively just do this:

int myInt = rdr.GetByte(j);

Which one you choose is a matter of preference (whether you want to document the fact that a cast is taking place or not). Note that you will need the explicit cast if you want to use type inference, or otherwise myInt will have the wrong type:

var myInt = (int) rdr.GetByte(j);


This is similar to Stephen Cleary's comment on the accepted answer, however I am required to specify the size of the int. This worked for me:

int value = Convert.ToInt32(rdr.GetValue(j));

(And it also provided backward compatibility with a database column using an int.)


Quick tidbit I ran into as a kind of corner case. If you have an object type that is of type System.Byte, you can not directly cast to int. You must first cast to a byte, then cast to an int.

public int Method(object myByte)
{
    // will throw a cast exception
    // var val = (int)myInt;

    // will not throw a cast exception
    var val = (int)((byte)myInt)
    return val;
}

Method((byte)1);
0

精彩评论

暂无评论...
验证码 换一张
取 消