小编Sco*_*ott的帖子

将char数组转换为字节数组并再次返回

我正在寻找将Java char数组转换为字节数组而不创建中间数String,因为char数组包含密码.我查了几种方法,但它们似乎都失败了:

char[] password = "password".toCharArray();

byte[] passwordBytes1 = new byte[password.length*2];
ByteBuffer.wrap(passwordBytes1).asCharBuffer().put(password);

byte[] passwordBytes2 = new byte[password.length*2];
for(int i=0; i<password.length; i++) {
    passwordBytes2[2*i] = (byte) ((password[i]&0xFF00)>>8); 
    passwordBytes2[2*i+1] = (byte) (password[i]&0x00FF); 
}

String passwordAsString = new String(password);
String passwordBytes1AsString = new String(passwordBytes1);
String passwordBytes2AsString = new String(passwordBytes2);

System.out.println(passwordAsString);
System.out.println(passwordBytes1AsString);
System.out.println(passwordBytes2AsString);
assertTrue(passwordAsString.equals(passwordBytes1) || passwordAsString.equals(passwordBytes2));
Run Code Online (Sandbox Code Playgroud)

断言总是失败(并且,关键是,当在生产中使用代码时,密码被拒绝),但是打印语句打印出密码三次.为什么passwordBytes1AsStringpasswordBytes2AsString不同passwordAsString,但看起来相同?我错过了一个空终结符或什么?我该怎么做才能使转换和非转换工作?

java arrays byte char

36
推荐指数
4
解决办法
7万
查看次数

默认实现还是抽象方法?

将方法的默认实现放在超类中更好,并在子类想要偏离它时重写它,或者你应该只留下超类方法摘要,并在许多子类中重复正常实现?

例如,我参与的项目有一个类,用于指定它应该停止的条件.抽象类如下:

public abstract class HaltingCondition{
    public abstract boolean isFinished(State s);
}
Run Code Online (Sandbox Code Playgroud)

一个简单的实现可能是:

public class AlwaysHaltingCondition extends HaltingCondition{
    public boolean isFinished(State s){
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们用对象做这个的原因是我们可以随意组合这些对象.例如:

public class ConjunctionHaltingCondition extends HaltingCondition{
    private Set<HaltingCondition> conditions;

    public void isFinished(State s){
        boolean finished = true;
        Iterator<HaltingCondition> it = conditions.iterator();
        while(it.hasNext()){
            finished = finished && it.next().isFinished(s);
        }
        return finished;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我们有一些暂停条件需要通知事件已经发生.例如:

public class HaltAfterAnyEventHaltingCondition extends HaltingCondition{
    private boolean eventHasOccurred = false;

    public void eventHasOccurred(Event e){
        eventHasOccurred = true;
    }

    public boolean isFinished(State …
Run Code Online (Sandbox Code Playgroud)

java polymorphism default abstract-methods

24
推荐指数
1
解决办法
2万
查看次数

调用daemon()和调用fork(),setsid(),fork()等有什么区别?

我一直在寻找创建Unixdæmons,似乎有两种方法.在啰嗦一句,这似乎拿出搜索时是调用fork(),setsid(),fork()再次chdir()到安全的地方,设置umask(),最后close() stdin,stdoutstderr.

man daemon然而,运行会提供有关daemon()函数的信息,这似乎与上面的内容完全相同.这两种方法之间是否存在差异,或者daemon()只是一种与冗长方法相同的便利函数?是否更好,特别是对于新手C程序员?

c unix fork daemon

11
推荐指数
1
解决办法
7516
查看次数

为什么我的查询陷入僵局?

我正在尝试将一些文件插入到Postgres数据库中.由于需要大量复制,我们将文件本身放入file表中,然后将它们链接到我们与output_file表一起使用的数据库部分.由于file表也​​由除output_file(例如,类似input_file表)之外的表引用,其列之一是引用计数,当插入行时由触发器更新output_file(而其他表也是如此,尽管它们不是在问题发生的时候使用.

CREATE TABLE file
(
    file_id serial PRIMARY KEY,
    --other columns
    occurences integer NOT NULL DEFAULT 0
);

CREATE TABLE output_file
(
    output_file_id serial PRIMARY KEY,
    --other columns
    file_id integer REFERENCES file NOT NULL
);

CREATE OR REPLACE FUNCTION file_insert() RETURNS opaque AS '
    BEGIN
        UPDATE file
        SET occurences = occurences + 1
        WHERE file.file_id = NEW.file_id;

        RETURN NEW;
    END;
' LANGUAGE plpgsql;

CREATE TRIGGER output_file_insert AFTER INSERT …
Run Code Online (Sandbox Code Playgroud)

java postgresql deadlock jdbc

5
推荐指数
1
解决办法
5912
查看次数

使用Java分叉特权

我正在用Java编写一个服务器程序,允许用户使用DRMAA提交作业.虽然主服务器进程运行为root,但它只是对用户进行身份验证,然后启动另一个以该用户身份运行的Java程序,并实际完成工作以符合最小化权限的原则.最初,我正在使用Runtime.exec()sudo(下面的例子)这样做,这个工作正常,直到进程被篡改,此时sudo因为它没有终端而感到沮丧.

String[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram};
Runtime.getRuntime().exec(command, null, getHomeDirectory(username));
Run Code Online (Sandbox Code Playgroud)

在作为守护进程运行时,在Java中执行此分叉特权模式的最佳方法是什么?有办法吗?我是否必须打破C并学习如何使用JNI创建JVM?

java unix permissions fork process

3
推荐指数
1
解决办法
1772
查看次数