从byte []数组填充C#结构的最佳方法是什么,其中数据来自C/C++结构?C结构看起来像这样(我的C很生锈):
typedef OldStuff {
CHAR Name[8];
UInt32 User;
CHAR Location[8];
UInt32 TimeStamp;
UInt32 Sequence;
CHAR Tracking[16];
CHAR Filler[12];
}
Run Code Online (Sandbox Code Playgroud)
并填写这样的东西:
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(0)]
public string Name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(8)]
public uint User;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(12)]
public string Location;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(20)]
public uint TimeStamp;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(24)]
public uint Sequence;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
[FieldOffset(28)]
public string Tracking;
}
Run Code Online (Sandbox Code Playgroud)
什么是复制OldStuff
到的最佳方式NewStuff
,如果OldStuff
作为byte []数组传递? …
首先让我说我从来没有使用PHP,但我想学习它,所以我的问题是你如何在Visual Studio Ultimate中使用PHP?它类似于你如何声明JQuery即
$(document).ready(function ()
{
// Code goes here?
});
Run Code Online (Sandbox Code Playgroud)
我在Google上进行过多次搜索,但我找不到我想要的答案.
或者我需要一个完整的不同软件才能使用它?
我正在运行Tomcat应用程序,我需要显示一些时间值.不幸的是,时间过了一个小时.我调查了一下,发现我的默认TimeZone被设置为:
sun.util.calendar.ZoneInfo[id="GMT-08:00",
offset=-28800000,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Run Code Online (Sandbox Code Playgroud)
而不是太平洋时区.当我尝试打印默认时区的显示名称时会进一步显示,并显示 "GMT-08:00",这似乎表明它未正确设置为美国太平洋时区.我在Ubuntu Hardy Heron上运行,从Gutsy Gibbon升级.
是否有可以更新的配置文件告诉JRE使用Pacific以及所有相关的夏令时信息?我的机器上的时间显示正确,因此它似乎不是操作系统范围内的错误配置.
好的,这是一个更新.一位同事建议我在我的/ etc/profile中更新JAVA_OPTS以包含"-Duser.timezone = US/Pacific",这有效(我也看到了CATALINA_OPTS,我也更新了).实际上,我只是将更改导出到变量而不是使用新的/ etc/profile(稍后重新启动将获取更改,我将是金色的).
但是,我仍然认为有一个更好的解决方案......应该有一个Java配置,它说明它正在使用什么时区,或者它是如何抓住时区的.如果有人知道这样的设置,那将是非常棒的,但是现在这是一个不错的解决方法.
我使用1.5,这绝对是一个DST问题.如您所见,时区设置为不使用夏令时.我的信念是它通常设置为-8偏移而不是特定的太平洋时区.由于泛型-8偏移没有夏令时信息,它当然不使用它,但问题是,我在哪里告诉Java在启动时使用太平洋时区?我不是在寻找程序化解决方案,它应该是一个配置解决方案.
我使用YouTube API按块上传视频块(请参阅下面的代码).但是,上传有时会因较大的文件(+ 1GB)而失败,但并非总是如此.上传显示已完成,但只能播放几分钟,其余内容将被截断.我做了一些研究,但没有取得明显的成功.我的问题现在:
非常感谢任何正确方向的帮助/领导.我甚至会打出500分的赏金,因为这让我发疯了(刚刚完成......)
附录:脚本在命令行上通过Gearman Server运行,并带有set_time_limit(0);
set.代码/功能只是一个提取(运行较小的文件,有时甚至高达10GB).
编辑:根据airgistal和GeorgeQ上面的评论,我已经改变了while循环直接读取块(feof()
不再是)并将状态保存到数据库.
/*
Uploads one file to youtube chunk by chunk
*/
function uploadFile($dbfile) {
$client = $this->client;
$youtube = new Google_Service_YouTube($client);
$htmlBody = "";
try {
// Create a snippet with title, description, tags and category ID
// Create an asset resource and set its snippet metadata and type.
// This example sets the video's title, description, keyword tags, and
// …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个包含多个公共类和方法的库,以及库本身使用的几个私有或内部类和方法.
在公共方法中,我有一个空检查和抛出这样的:
public int DoSomething(int number)
{
if (number == null)
{
throw new ArgumentNullException(nameof(number));
}
}
Run Code Online (Sandbox Code Playgroud)
但是这让我思考,我应该在什么级别添加参数null检查方法?我是否也开始将它们添加到私有方法?我应该只为公共方法做吗?
我的目标
我想有一个主处理线程(非GUI),并能够根据需要在自己的后台线程中分离GUI,并让我的主非GUI线程继续工作.换句话说,我希望我的主非GUI线程成为GUI线程的所有者,反之亦然.我不确定Windows Forms(?)是否可行
背景
我有一个基于组件的系统,其中控制器动态加载程序集并实例化并运行IComponent
使用单个方法实现公共接口的类DoStuff()
.
通过xml配置文件和添加包含不同实现的新程序集来配置加载的组件IComponent
.组件为主应用程序提供实用程序功能.虽然主程序正在做这件事,例如控制核电站,组件可能正在执行公用事业任务(在他们自己的线程中),例如清理数据库,发送电子邮件,在打印机上打印有趣的笑话,你有什么.我想要的是使这些组件中的一个能够显示GUI,例如具有所述电子邮件发送组件的状态信息.
整个系统的生命周期如下所示
DoStuff()
以初始化它并使其在自己的线程中实现自己的生命.如果组件启动了GUI,我还没有能够成功执行第3点DoStuff()
.它只是暂停,直到GUI关闭.直到GUI关闭,程序才会进入第4点.
如果允许这些组件启动它们自己的Windows窗体GUI,那就太好了.
问题
当组件尝试启动GUI时DoStuff()
(确切的代码行是组件运行时Application.Run(theForm)
),组件以及因此我们的系统在该Application.Run()
行"挂起" 直到GUI关闭.好吧,正如预期的那样,刚启动的GUI工作正常.
组件示例.一个与GUI没有任何关系,而第二个则是一个可爱的窗户,里面有粉红色蓬松的兔子.
public class MyComponent1: IComponent
{
public string DoStuff(...) { // write something to the database }
}
public class MyComponent2: IComponent
{
public void DoStuff()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
// I want the thread to immediately return after the GUI
// is fired up, …
Run Code Online (Sandbox Code Playgroud) 创建CSV字符串的典型方法(伪代码):
代码示例:
public string ReturnAsCSV(ContactList contactList)
{
StringBuilder sb = new StringBuilder();
foreach (Contact c in contactList)
{
sb.Append(c.Name + ",");
}
sb.Remove(sb.Length - 1, 1);
//sb.Replace(",", "", sb.Length - 1, 1)
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我喜欢通过检查容器是否为空来添加逗号的想法,但这是否意味着更多的处理,因为它需要在每次出现时检查字符串的长度?
我觉得应该有一个更简单/更清洁/更有效的方法来删除最后一个逗号.有任何想法吗?
由于WMI类Win32_OperatingSystem仅在Windows Vista中包含OSArchitecture,因此我使用注册表快速编写了一种方法,以尝试确定当前系统是32位还是64位系统.
private Boolean is64BitOperatingSystem()
{
RegistryKey localEnvironment = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
String processorArchitecture = (String) localEnvironment.GetValue("PROCESSOR_ARCHITECTURE");
if (processorArchitecture.Equals("x86")) {
return false;
}
else {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,它对我们来说非常好,但我不确定我有多喜欢浏览注册表.这是一个非常标准的做法还是有更好的方法?
编辑:哇,在预览中,该代码看起来更漂亮.下次我会考虑连接到pastebin或其他东西.
我正在编写一个使用WNetAddConnection2 API 映射网络驱动器的软件.万一它是相关的,这是一个WebDAV驱动器,而不是一个普通的SMB共享.
驱动器采用我想要更改的默认名称.
网上的一些答案建议使用System.IO.DriveType,例如:
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (var drive in allDrives)
{
if (drive.DriveType == DriveType.Network && drive.Name.StartsWith("Z:"))
{
drive.VolumeLabel = "DriveInfo";
}
}
Run Code Online (Sandbox Code Playgroud)
这明确地不适用于网络驱动器,并且由MSDN支持,其中声明UnauthorizedAccessException
将抛出异常.
其次,我尝试使用shell方法:
Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";
Run Code Online (Sandbox Code Playgroud)
代码执行时没有错误,但不重命名驱动器.这就是它变得奇怪的地方,我找到了这些东西写入的注册表路径:
HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ MountPoints2
上面的代码创建了一个看起来正确的密钥,并添加了一个_LabelFromReg
带有"Shell" 的REG_SZ作为值.但是,这不会反映在资源管理器或其他任何地方.
然后我通过右键单击并选择"重命名"手动重命名映射驱动器.
这样做会创建一个新的,稍微不同的键,MountPoints2
其中完美地工作.
所以,上面的shell代码并没有完全正确地解决路径 - 我还能尝试其他的东西吗?上面让我相信Windows必须在内部使用不同的API调用来重命名驱动器?
更新1
这肯定与这些是WebDAV驱动器有关.必须进行一些引擎盖下的处理.
我的软件地图https://myurl.com@ssl/stuff/destination/docs
.使用该Net Use
命令可以看到确切的路径.这是shell
上面的代码添加到注册表并尝试命名的路径.
但是,在Windows资源管理器中将鼠标悬停在驱动器上会让我https://myurl.com@ssl/anotherfolder/stuff/destination
和在Explorer中手动重命名的路径添加到注册表中.
到目前为止,我已经设法弄清楚如何从WMI(Win32_LogicalDisk - > ProviderName)调用返回第二个路径,但我真的想避免手动注册表项.
没有示例如何通过C#检测耳机是否插入.
我认为应该是一些事件......
使用WMI有意义吗?
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\cimv2",
"SELECT * FROM Win32_SoundDevice");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_SoundDevice instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("StatusInfo: {0}", queryObj["StatusInfo"]);
}
Run Code Online (Sandbox Code Playgroud)
有人会很高兴提供它吗?
谢谢!
c# ×7
.net ×3
php ×2
windows ×2
audio-device ×1
csv ×1
headphones ×1
java ×1
linux ×1
marshalling ×1
registry ×1
timezone ×1
winforms ×1
youtube ×1
youtube-api ×1