C#将包含c样式字符串的byte []转换为字符串 - NOT Encoding.GetString(byte [])

时间:2011-05-11 13:04:36

标签: c# string

愚蠢的我试图将从外部源接收的字节数组转换为字符串。 (是的,我确实知道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 );
}

7 个答案:

答案 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 );
}