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构造函数,该范围之外的字符被替换为 问号(?)执行编码操作之前。
如果您需要毫发无损地发送八位位集,则最好使用包裹在StreamReader
和StreamWriter
中的System.IO.MemoryStream
。
然后,您可以通过其GetBuffer()
方法或其ToArray()
方法访问MemoryStream
的支持存储。GetBuffer()
为您提供了对实际的备用商店的引用。但是,它可能包含分配但未使用的字节—您需要检查流的Length
和Capacity
。ToArray()
分配一个新数组并将实际流内容复制到其中,因此您收到的数组参考是正确的长度。