转换数据类型'到字节数组

本文关键字:到字节 数组 数据类型 转换 | 更新日期: 2023-09-27 18:06:47

我必须将值(c#中的double/float)转换为字节,需要一些帮助…

//数据类型长4byte -99999999,99到99999999,99
//数据类型长4byte -99999999,9 ~ 99999999,9
//数据类型短2byte -999,99到999,99
//数据类型短2byte -999,9到999,9

在我的"世界在家里",我只是字符串它和ASCII.GetBytes()。

但现在,在这个世界上,我们必须让空间变得更不可能。
事实上,'- 999999999999,99'占用了12个字节,而不是4个字节!如果是'long'数据类型

[编辑]
由于一些帮助和回答,我附上了一些结果在这里,

long lng = -9999999999L;
byte[] test = Encoding.ASCII.GetBytes(lng.ToString());  // 11 byte
byte[] test2 = BitConverter.GetBytes(lng);              // 8 byte
byte[] mybyt = BitConverter.GetBytes(lng);              // 8 byte
byte[] bA = BitConverter.GetBytes(lng);                 // 8 byte

还有一个细节有待发现。lng变量得到8个字节,即使它持有一个较低的值,即99951(我不会包括ToString()示例)。

如果值更"短",即-999,99—999,99,它将只占用2字节空间。
[结束编辑]

转换数据类型'到字节数组

您检查过BitConverter了吗

long lng =-9999999999L;
byte[] mybyt = BitConverter.GetBytes(lng);

希望这是你想要的

试着这样做:

long l = 4554334;
byte[] bA = BitConverter.GetBytes(l);

请注意,在2个字节中,您只能有4个完整的数字+符号,而在4个字节中,您只能有9个数字+符号,所以我必须相应地缩放您的先决条件。

public static byte[] SerializeLong2Dec(double value)
{
    value *= 100;
    value = Math.Round(value, MidpointRounding.AwayFromZero);
    if (value < -999999999.0 || value > 999999999.0)
    {
        throw new ArgumentOutOfRangeException();
    }
    int value2 = (int)value;
    return BitConverter.GetBytes(value2);
}
public static double DeserializeLong2Dec(byte[] value)
{
    int value2 = BitConverter.ToInt32(value, 0);
    return (double)value2 / 100.0;
}
public static byte[] SerializeLong1Dec(double value) {
    value *= 10;
    value = Math.Round(value, MidpointRounding.AwayFromZero);
    if (value < -999999999.0 || value > 999999999.0) {
        throw new ArgumentOutOfRangeException();
    }
    int value2 = (int)value;
    return BitConverter.GetBytes(value2);
}
public static double DeserializeLong1Dec(byte[] value) {
    int value2 = BitConverter.ToInt32(value, 0);
    return (double)value2 / 10.0;
}
public static byte[] SerializeShort2Dec(double value) {
    value *= 100;
    value = Math.Round(value, MidpointRounding.AwayFromZero);
    if (value < -9999.0 || value > 9999.0) {
        throw new ArgumentOutOfRangeException();
    }
    short value2 = (short)value;
    return BitConverter.GetBytes(value2);
}
public static double DeserializeShort2Dec(byte[] value) {
    short value2 = BitConverter.ToInt16(value, 0);
    return (double)value2 / 100.0;
}
public static byte[] SerializeShort1Dec(double value) {
    value *= 10;
    value = Math.Round(value, MidpointRounding.AwayFromZero);
    if (value < -9999.0 || value > 9999.0) {
        throw new ArgumentOutOfRangeException();
    }
    short value2 = (short)value;
    return BitConverter.GetBytes(value2);
}
public static double DeserializeShort1Dec(byte[] value) {
    short value2 = BitConverter.ToInt16(value, 0);
    return (double)value2 / 10.0;
}

所以很明显,(带符号的)短型(16位)的范围是-32,768到32,767,所以很明显,你只有4个完整数字加上一小部分(0-3),(带符号的)int型(32位)的范围是- 2,147,483,648到2,147,483,647,所以很明显,你只有9个完整数字加上一小部分(0-2)。对于(带符号的)长(64位),你有-9,223,372,036,854,775,808到9,223,372,036,854,775,807,所以18位加(大)位。使用浮点数会降低精度。浮点数(32位)的精度约为7位,而双精度(64位)的精度约为15-16位。

致所有阅读这个问题和答案的人。请注意:

//convert to bytes
long number = 123;
byte[] bytes = BitConverter.GetBytes(number);
//convert back to int64
long newNumber = BitConverter.ToInt64(bytes);
//numbers are different on x64 systems!!!
number != newNumber;

解决方法是检查您在哪个系统上运行:

newNumber = BitConverter.IsLittleEndian
    ? BitConverter.ToInt64(bytes, 0)
    : BitConverter.ToInt64(bytes.Reverse().ToArray(), 0);
long longValue = 9999999999L;
        Console.WriteLine("Long value: " + longValue.ToString());
        bytes = BitConverter.GetBytes(longValue);
        Console.WriteLine("Byte array value:");
        Console.WriteLine(BitConverter.ToString(bytes));

正如其他答案所指出的,您可以使用BitConverter来获得基本类型的字节表示。

您说过,在您所处的当前世界中,有责任尽可能简洁地将这些值表示为,在这种情况下,您应该考虑可变长度编码(尽管该文档可能有点抽象)。

如果您决定这种方法适用于您的情况,我建议查看协议缓冲区项目如何表示标量类型,因为其中一些类型使用可变长度编码进行编码,如果数据集倾向于较小的绝对值,则会产生较短的输出。(该项目在New BSD许可下是开源的,因此您将能够从源代码存储库中学习所使用的技术,甚至可以在您自己的项目中使用该源代码。)