/// <inheritdoc /> public static GroupMemberInfo GetGroupMemberInfo(long groupId, long qq) { try { var data = CQAPI.CQ_getGroupMemberInfoV2(_cqauthcode, groupId, qq, 0); var memberBytes = Convert.FromBase64String(data); var info = new GroupMemberInfo(); var groupNumberBytes = new byte[8]; Array.Copy(memberBytes, 0, groupNumberBytes, 0, 8); Array.Reverse(groupNumberBytes); info.GroupId = BitConverter.ToInt64(groupNumberBytes, 0); var qqNumberBytes = new byte[8]; Array.Copy(memberBytes, 8, qqNumberBytes, 0, 8); Array.Reverse(qqNumberBytes); info.Number = BitConverter.ToInt64(qqNumberBytes, 0); var nameLengthBytes = new byte[2]; Array.Copy(memberBytes, 16, nameLengthBytes, 0, 2); Array.Reverse(nameLengthBytes); var nameLength = BitConverter.ToInt16(nameLengthBytes, 0); var nameBytes = new byte[nameLength]; Array.Copy(memberBytes, 18, nameBytes, 0, nameLength); info.NickName = Encoding.Default.GetString(nameBytes); var cardLengthBytes = new byte[2]; Array.Copy(memberBytes, 18 + nameLength, cardLengthBytes, 0, 2); Array.Reverse(cardLengthBytes); var cardLength = BitConverter.ToInt16(cardLengthBytes, 0); var cardBytes = new byte[cardLength]; Array.Copy(memberBytes, 20 + nameLength, cardBytes, 0, cardLength); info.InGroupName = Encoding.Default.GetString(cardBytes); var genderBytes = new byte[4]; Array.Copy(memberBytes, 20 + nameLength + cardLength, genderBytes, 0, 4); Array.Reverse(genderBytes); info.Gender = BitConverter.ToInt32(genderBytes, 0) == 0 ? "男" : " 女"; var ageBytes = new byte[4]; Array.Copy(memberBytes, 24 + nameLength + cardLength, ageBytes, 0, 4); Array.Reverse(ageBytes); info.Age = BitConverter.ToInt32(ageBytes, 0); var areaLengthBytes = new byte[2]; Array.Copy(memberBytes, 28 + nameLength + cardLength, areaLengthBytes, 0, 2); Array.Reverse(areaLengthBytes); var areaLength = BitConverter.ToInt16(areaLengthBytes, 0); var areaBytes = new byte[areaLength]; Array.Copy(memberBytes, 30 + nameLength + cardLength, areaBytes, 0, areaLength); info.Area = Encoding.Default.GetString(areaBytes); var addGroupTimesBytes = new byte[4]; Array.Copy(memberBytes, 30 + nameLength + cardLength + areaLength, addGroupTimesBytes, 0, 4); Array.Reverse(addGroupTimesBytes); info.JoinTime = new DateTime(1970, 1, 1, 0, 0, 0).ToLocalTime() .AddSeconds(BitConverter.ToInt32(addGroupTimesBytes, 0)); var lastSpeakTimesBytes = new byte[4]; Array.Copy(memberBytes, 34 + nameLength + cardLength + areaLength, lastSpeakTimesBytes, 0, 4); Array.Reverse(lastSpeakTimesBytes); info.LastSpeakingTime = new DateTime(1970, 1, 1, 0, 0, 0).ToLocalTime() .AddSeconds(BitConverter.ToInt32(lastSpeakTimesBytes, 0)); var levelNameLengthBytes = new byte[2]; Array.Copy(memberBytes, 38 + nameLength + cardLength + areaLength, levelNameLengthBytes, 0, 2); Array.Reverse(levelNameLengthBytes); var levelNameLength = BitConverter.ToInt16(levelNameLengthBytes, 0); var levelNameBytes = new byte[levelNameLength]; Array.Copy(memberBytes, 40 + nameLength + cardLength + areaLength, levelNameBytes, 0, levelNameLength); info.Level = Encoding.Default.GetString(levelNameBytes); var authorBytes = new byte[4]; Array.Copy(memberBytes, 40 + nameLength + cardLength + areaLength + levelNameLength, authorBytes, 0, 4); Array.Reverse(authorBytes); var authority = BitConverter.ToInt32(authorBytes, 0); info.Authority = authority.ToString(); var badBytes = new byte[4]; Array.Copy(memberBytes, 44 + nameLength + cardLength + areaLength + levelNameLength, badBytes, 0, 4); Array.Reverse(badBytes); info.HasBadRecord = BitConverter.ToInt32(badBytes, 0) == 1; var titleLengthBytes = new byte[2]; Array.Copy(memberBytes, 48 + nameLength + cardLength + areaLength + levelNameLength, titleLengthBytes, 0, 2); Array.Reverse(titleLengthBytes); var titleLength = BitConverter.ToInt16(titleLengthBytes, 0); var titleBytes = new byte[titleLength]; Array.Copy(memberBytes, 50 + nameLength + cardLength + areaLength + levelNameLength, titleBytes, 0, titleLength); info.Title = Encoding.Default.GetString(titleBytes); var titleExpireBytes = new byte[4]; Array.Copy(memberBytes, 50 + nameLength + cardLength + areaLength + levelNameLength + titleLength, titleExpireBytes, 0, 4); Array.Reverse(titleExpireBytes); info.TitleExpirationTime = BitConverter.ToInt32(titleExpireBytes, 0); var modifyCardBytes = new byte[4]; Array.Copy(memberBytes, 54 + nameLength + cardLength + areaLength + levelNameLength + titleLength, titleExpireBytes, 0, 4); Array.Reverse(titleExpireBytes); info.CanModifyInGroupName = BitConverter.ToInt32(modifyCardBytes, 0) == 1; return(info); } catch (Exception) { //无法获取到群成员信息,直接返回null return(null); } }