愚蠢的我试图将从外部源接收的字节数组转换为字符串。 (是的,我确实知道Encoding.GetString(byte[])
。
到目前为止我所拥有的:
void myfunc()
{
byte[] rawData = new byte[ 128 ];
for( int i = 0; i < rawData.Length; ++i )
{
rawData[ i ] = 0;
}
rawData[ 0 ] = (byte)'H';
rawData[ 1 ] = (byte)'e';
rawData[ 2 ] = (byte)'l';
rawData[ 3 ] = (byte)'l';
rawData[ 4 ] = (byte)'o';
string asString = Encoding.UTF8.GetString( rawData, 0, rawData.Length );
string asRealString = Encoding.UTF8.GetString( rawData );
}
两个字符串都包含Hello部分,但之后还包含很多\ 0,这不是我所期望的。 调试器的输出: asRealString =
"Hello\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
有没有办法让我像“你好”一样给我一个字符串?
我做了goolge,但我得到的只是Encoding.GetString(byte[])
......
编辑:字节数组的创建者超出了我的范围!我确实把它作为更大的C-Style结构的一部分。并且没有字符串的前导长度。 此外,我希望有一个内置的方式来实现它,我没有必要找到第一个\ o和tehn转换知道长度....
修改 这是我最后使用的内容:
private static string convertCString( byte[] buffer, int maxLength, Encoding targetEncoding )
{
int length = 0;
int realMax = buffer.Length < maxLength ? buffer.Length : maxLength;
for(
; 0 != buffer[length] && length < realMax
; ++length )
{}
return targetEncoding.GetString( buffer, 0, length );
}
答案 0 :(得分:13)
找到第一个0
:
int len = Array.IndexOf(rawData, (byte)0); // maybe some bounds check too
string asString = Encoding.UTF8.GetString(rawData, 0, len);
答案 1 :(得分:2)
尝试
Encoding.UTF8.GetString( rawData ).Trim();
答案 2 :(得分:2)
字节数组的creatin超出了我的范围!我确实把它作为更大的C-Style结构的一部分。并且没有字符串的前导长度。
我假设你现在拥有的是:
struct CStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]
public byte[] data;
}
尝试将其更改为:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct CStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string data;
}
答案 3 :(得分:1)
你为什么没想到?你明确地告诉它这样做:
byte[] rawData = new byte[ 128 ];
for( int i = 0; i < rawData.Length; ++i )
{
rawData[ i ] = 0; // RIGHT HERE
}
上面的代码创建了一个128项字节数组,for循环填充它。然后您的代码显式更改前5个字节的值。如果您不想看到\ 0,那么您需要先将其放在那里,或者在将其发送到GetString
之前将其从数组中排除。
答案 4 :(得分:0)
当你这样做时
string asString = Encoding.UTF8.GetString( rawData, 0, rawData.Length );
您是否可以传入字符串的实际长度,而不是传入rawData.Length
?
答案 5 :(得分:0)
new string(Array.ConvertAll(rawData, x => (char)x))
字符串构造函数将在第一个\ 0。
处终止字符串答案 6 :(得分:0)
void myfunc()
{
byte[] rawData = new byte[ 128 ];
//CLR will initialize each elemnet in arry to the 0
//for( int i = 0; i < rawData.Length; ++i )
//{
// rawData[ i ] = 0;
//}
rawData[ 0 ] = (byte)'H';
rawData[ 1 ] = (byte)'e';
rawData[ 2 ] = (byte)'l';
rawData[ 3 ] = (byte)'l';
rawData[ 4 ] = (byte)'o';
// you should know length of the received string (each IO read method return number of read bytes), if you don't know it you can try to search 0 as the EOS
var receivedBytes = Array.IndexOf(rawData, 0);
string asString = Encoding.ASCII.GetString( rawData, 0, receivedBytes );
}