代码之家  ›  专栏  ›  技术社区  ›  Brady Moritz

Int到字节数组

  •  51
  • Brady Moritz  · 技术社区  · 15 年前

    我以为.net有一种简单的转换方法可以用来将int转换成字节数组?我做了一个快速搜索,所有的解决方案都是一次一个字节的位掩蔽/移位,就像“好日子”。 有没有ToByteArray()方法?

    5 回复  |  直到 14 年前
        1
  •  95
  •   Marc Gravell    15 年前
    byte[] bytes = BitConverter.GetBytes(i);
    

    尽管也要注意你 可以 想查一下 BitConverter.IsLittleEndian 看哪条路会出现!

    注意如果你这样做 反复地 您可能希望通过两种移位操作自己编写数组来避免所有这些短期数组分配( >> / << ),或使用 unsafe 代码。轮班作业 它的优点是不受平台端性的影响;你 总是 按预期的顺序获取字节。

        2
  •  33
  •   Chris Taylor    15 年前

    马克的回答当然是正确的。但因为他提到了轮班操作员和不安全代码作为替代。我想分享一个不太常见的选择。使用结构与 Explicit 布局。这在原则上类似于C/C++。 union .

    下面是一个可以用来获取Int32数据类型的组件字节的结构示例,好处是它是双向的,您可以操作字节值并查看对Int的影响。

      using System.Runtime.InteropServices;
    
      [StructLayout(LayoutKind.Explicit)]
      struct Int32Converter
      {
        [FieldOffset(0)] public int Value;
        [FieldOffset(0)] public byte Byte1;
        [FieldOffset(1)] public byte Byte2;
        [FieldOffset(2)] public byte Byte3;
        [FieldOffset(3)] public byte Byte4;
    
        public Int32Converter(int value)
        {
          Byte1 = Byte2 = Byte3 = Byte4 = 0;
          Value = value;
        }
    
        public static implicit operator Int32(Int32Converter value)
        {
          return value.Value;
        }
    
        public static implicit operator Int32Converter(int value)
        {
          return new Int32Converter(value);
        }
      }
    

    现在可以如下使用

     Int32Converter i32 = 256;
     Console.WriteLine(i32.Byte1);
     Console.WriteLine(i32.Byte2);
     Console.WriteLine(i32.Byte3);
     Console.WriteLine(i32.Byte4);
    
     i32.Byte2 = 2;
     Console.WriteLine(i32.Value);
    

    当然,不变性警察可能不会对最后的可能性感到兴奋:)

        3
  •  2
  •   Steve Townsend    15 年前

    这可能不是,但如果你序列化了很多原始类型或POD结构, Google Protocol Buffers for .Net 可能对你有用。这解决了上面提到的endianness问题@Marc,以及其他一些有用的特性。

        4
  •  1
  •   JamesHoux    6 年前

    如果你是从谷歌来的

    另一个老问题的答案是John Skeet的库,它有一些工具可以让您直接将原始数据类型写入具有索引偏移量的字节[]。远胜于 BitConverter 如果你需要表演。

    Older thread discussing this issue here

    John Skeet's Libraries are here

    只需下载源代码并查看 MiscUtil.Conversion 命名空间。 EndianBitConverter.cs 为你处理一切。

        5
  •  0
  •   GregJF    11 年前

    这里的大多数答案要么是“不安全的”,要么是不安全的。BitConverter不安全。 因此,以 here (见PZahra的文章)我做了一个小小的安全版本,当BitConverter.IsLittleEndian==true时,只需反向读取字节数组

    void Main(){    
        Console.WriteLine(BitConverter.IsLittleEndian); 
        byte[] bytes = BitConverter.GetBytes(0xdcbaabcdfffe1608);
        //Console.WriteLine(bytes); 
        string hexStr = ByteArrayToHex(bytes);
        Console.WriteLine(hexStr);
    }
    
    public static string ByteArrayToHex(byte[] data) 
    { 
       char[] c = new char[data.Length * 2]; 
       byte b; 
      if(BitConverter.IsLittleEndian)
      {
            //read the byte array in reverse
            for (int y = data.Length -1, x = 0; y >= 0; --y, ++x) 
            { 
                b = ((byte)(data[y] >> 4)); 
                c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30); 
                b = ((byte)(data[y] & 0xF)); 
                c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30); 
            }               
        }
        else
        {
            for (int y = 0, x = 0; y < data.Length; ++y, ++x) 
            { 
                b = ((byte)(data[y] >> 4)); 
                c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30); 
                b = ((byte)(data[y] & 0xF)); 
                c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30); 
            }
        }
        return String.Concat("0x",new string(c));
    }
    

    它返回:

    True
    0xDCBAABCDFFFE1608
    

    它是进入字节数组的十六进制。

    推荐文章