【问题标题】:How to interpret byte as int?如何将字节解释为int?
【发布时间】:2019-08-08 14:56:12
【问题描述】:

我有一个从 Cpp 程序接收的 字节数组

arr[0..3] // a real32,
arr[4]    // a uint8,

如何将arr[4] 解释为int

(uint)arr[4] // Err: can't implicitly convert string to int.
BitConverter.ToUint16(arr[4]) // Err: Invalid argument.
buff[0+4] as int // Err: must be reference or nullable type

我是否必须将连续字节设为零才能将其解释为UInt16

好的,这里是混乱。最初,我定义了我的班级。

byte[] buff;
buff = getSerialBuffer();

public class Reading{
    public string scale_id;
    public string measure;
    public int measure_revised;
    public float wt;
}
rd = new Reading();
// !! here is the confusion... !!
// Err: Can't implicitly convert 'string' to 'int'
rd.measure = string.Format("{0}", buff[0 + 4]); 
// then I thought, maybe I should convert buff[4] to int first ? 
// I throw all forms of conversion here, non worked.
// but, later it turns out:
rd.measure_revised = buff[0+4]; // just ok.

所以基本上,我不明白为什么会发生这种情况

rd.measure = string.Format("{0}", buff[0 + 4]); 
//Err: Can't implicitly convert 'string' to 'int'

如果buff[4]是一个字节,字节是uint8,那can't implicitly convert string to int是什么意思?...让我很困惑。

【问题讨论】:

  • (uint)arr[4] // Err: can't implicitly convert string to int. 这似乎很奇怪...arr 的类型是什么?
  • 您似乎对是否需要 32 位 int 或 16 位 int 感到困惑。 intuintInt32UInt32)是 4 个字节(32 位)。 shortushortInt16UInt16)是 2 个字节(16 位)。
  • 对不起,它的 arr 是一个字节数组。我想要一个 C# 中不存在的 uin8 ...所以我只想将 arr[4] 用作 int 。
  • uint8 存在并且被调用 byte。您可以毫无问题地将byte 转换为int/uint。所以(uint)arr[4] // Err: can't implicitly convert string to int. 会起作用。
  • 如果arrbyte[],那么第一次转换(uint)arr[4] 就可以了。 (工作在某种意义上它不会导致给定的错误消息)

标签: c# .net-3.5 compact-framework bytebuffer uint8t


【解决方案1】:

你快到了。假设您想要前 4 个字节的 32 位 int(很难解释您的问题):

BitConverter.ToInt32(arr, 0);

这表示从arr 中获取 4 个字节,从索引0 开始,并将它们转换为 32 位 int。 (docs)

注意BitConverter 使用计算机的字节序,所以在 x86/x64 上这将是 little-endian。

如果您想使用显式字节顺序,则需要手动构造 int:

int littleEndian = arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24);
int bigEndian = arr[3] | (arr[2] << 8) | (arr[1] << 16) | (arr[0] << 24);

如果您想要前 4 个字节的 32 位浮点数,请参阅 Dmitry Bychenko 的回答。

【讨论】:

    【解决方案2】:

    如果我没听错,你有byte(不是string)数组

      byte[] arr = new byte[] {
        182, 243, 157, 63,  // Real32 - C# Single or float (e.g. 1.234f)
        123                 // uInt8  - C# byte            (e.g. 123) 
      };
    

    要找回floatbyte,您可以尝试BitConverter

      // read float / single starting from 0th byte
      float realPart = BitConverter.ToSingle(arr, 0);
      byte bytePart = arr[4];
    
      Console.Write($"Real Part: {realPart}; Integer Part: {bytePart}");
    

    结果:

      Real Part: 1.234; Integer Part: 123
    

    如果我们想编码arr,同样的想法(BitConverter 类):

      float realPart = 1.234f;
      byte bytePart = 123;
    
      byte[] arr = 
         BitConverter.GetBytes(realPart)
        .Concat(new byte[] { bytePart })
        .ToArray();
    
      Console.Write(string.Join(" ", arr));
    

    结果:

      182 243 157 63 123
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2020-02-01
      • 2010-10-01
      相关资源
      最近更新 更多