StringBuilder附加字节而无需格式化


DateTime todayDateTime = DateTime.Now;
StringBuilder todayDateTimeSB = new StringBuilder("0");
todayDateTimeSB.Append(todayDateTime.ToString("MMddyyyy"));
long todayDateTimeLongValue = Convert.ToInt64(todayDateTimeSB.ToString());
// convert to byte array packed decimal
byte[] packedDecValue = ToComp3UsingStrings(todayDateTimeLongValue); 
// append each byte to the string builder
foreach (byte b in packedDecValue)
{
    sb.Append(b); // bytes 56-60
}
sb.Append(' ', 37);

上面的代码需要当前日期,将其格式化为较长的值,并将其传递给将其转换为包装的小数格式的方法。我知道以上是从代码踏上代码开始的上述作用的,字节阵列具有我期望的所有字节的正确十六进制值。

但是,以上是我遇到问题的代码,特别是我已经研究了,并发现字符串构建器.Append(byte)实际上对该字节进行了ToString()。这正在改变字节将其添加到字符串时的值。问题是我如何告诉StringBuilder按原样进行"字节",并将其存储在内存中而不格式化/更改值。我知道还有一个.AppendFormat(),它具有几个使用IFormatProvider的重载数据。

您可以将字节铸成char:

sb.Append((char)b);

您也可以使用ASCIIEncoding立即转换所有字节:

string s = Encoding.ASCII.GetString(packedDecValue);
sb.Append(s);

如前所述,在Unicode世界中,字节(八位字)不是字符。CLR在内部和内部代表UTF-16编码中代表它们。StringBuilder构建UTF-16编码的Unicode字符串。

拥有该UTF-16字符串后,可以使用,例如UTF-8或assiiencoding重新编码它。但是,在这两种情况下,代码点0x0080及更高版本都不会留下。

utf-8使用2个八位字节用于代码点0x0080– 0x07ff;3代码点0x0800– 0xffff等。http://en.wikipedia.org/wiki/utf-8#description

ASCII编码更糟:根据文档,0x0000– 0x007f的代码点简单地插入:

如果使用ecdoding.ascii属性返回的默认编码器或 assiiencoding构造函数,该范围之外的字符被替换为 问号(?)执行编码操作之前。

如果您需要毫发无损地发送八位位集,则最好使用包裹在StreamReaderStreamWriter中的System.IO.MemoryStream

然后,您可以通过其GetBuffer()方法或其ToArray()方法访问MemoryStream的支持存储。GetBuffer()为您提供了对实际的备用商店的引用。但是,它可能包含分配但未使用的字节—您需要检查流的LengthCapacityToArray()分配一个新数组并将实际流内容复制到其中,因此您收到的数组参考是正确的长度。

相关内容

  • 没有找到相关文章

最新更新