【问题标题】:issue with byte array, I cant Shift left byte字节数组问题,我不能左移字节
【发布时间】:2014-04-30 07:20:42
【问题描述】:

我想将包含二进制数的字符串转换为字节数组。 为此,我有这个功能:

private byte[] ToByteArray(string StringToConvert)
{
   byte[] ByteArray = new byte[StringToConvert.Length/8];
   byte temp;
   for (int i = 0; i < StringToConvert.Length; i=i+8)
   {
      for (int j = i; j < 8; j++)
      {
         temp = Convert.ToByte(StringToConvert[j]);
         ByteArray[i]=ByteArray[i] << temp;
      }
   }

   return ByteArray;
}

我得到一个错误,我无法将字节转换为 int(?) 在

ByteArray[i]=ByteArray[i]<< temp;

我做错了什么?

【问题讨论】:

  • 你真正想做什么?字节不是位。
  • ByteArray[i]=(byte)(ByteArray[i] &lt;&lt; temp);
  • for (int j = i; j &lt; 8; 看起来很可疑。
  • 你从一个充满 0 的数组开始,然后它们只会四处移动......最终结果:全为零。
  • 我想取 8 位并使其成为一个字节,这就是重点。 Henk Holterman 你有更好的解决方案吗?

标签: c# byte bytearray


【解决方案1】:

这会将包含二进制数的字符串(如"001011101101011010101011")转换为字节数组{ 46, 214, 171 }

private Byte[] ToByteArray(String stringToConvert)
{
   Contract.Requires(stringToConvert != null);
   Contract.Requires(stringToConvert.Length % 8 == 0);

   var result = new Byte[stringToConvert.Length / 8];

   for (var index = 0; index < stringToConvert.Length / 8; index++)
   {
      result[index] = Convert.ToByte(stringToConvert.Substring(index * 8, 8), 2);
   }

   return result;
}

【讨论】:

    【解决方案2】:

    使用

    ByteArray[i] = (byte)(ByteArray[i] << temp);
    

    正如MSDN (Shift Operators) 中提到的,以下是预定义的移位运算符

    int operator <<(int x, int count);
    uint operator <<(uint x, int count);
    long operator <<(long x, int count);
    ulong operator <<(ulong x, int count);
    

    并且字节值 (ByteArray[i]) 匹配第一个运算符规范,然后调用该规范并返回 int 值。因此,要将int 值存储在byte 中,您必须将其类型转换为byte。由于intbyte 不是隐式的(可能会发生数据丢失),因此您必须明确地进行转换,如上一行所示。

    【讨论】:

      【解决方案3】:

      我将在两行之间阅读并猜测 StringToConvert 是一个包含 8 个 '0' 或 '1' 的倍数的字符串,而您要做的是将其转换为字节数组。

      private byte[] ToByteArray(string StringToConvert)
      {
          byte[] ByteArray = new byte[StringToConvert.Length/8];
          for (int i = 0; i < StringToConvert.Length/8; i++)
          {
              for (int j = 0; j < 8; j++)
              {
                  char bitStr = StringToConvert[i*8+j];
                  ByteArray[i] = (byte)((ByteArray[i] << 1) | (bit=='1' ? 1 : 0));
              }
          }
      
          return ByteArray;
      }
      

      【讨论】:

      • 大声笑我忘记了 [i*8+j] 部分...我能问一下为什么 (bit=='1' ? 1 : 0) 部分是必要的吗? "(byte)(ByteArray[i]
      • @user3531487 它们根本不等价。 Convert.ToByte('1') == 0x31 而你希望它等于 0x1。
      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      相关资源
      最近更新 更多